gpt4 book ai didi

jsf - 如何使用 j_security_check 获取已连接用户的数量及其角色?

转载 作者:行者123 更新时间:2023-12-01 19:46:11 26 4
gpt4 key购买 nike

我通过托管 bean 以这种方式获取连接用户的用户名(使用 j_security_check):

......
username = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName();

然后以这种方式将其显示在 jsf 页面中:#{userBean.username}但我认为没有办法获得连接用户的数量并获得他们的角色。换句话说,除了用户名之外,我还想显示用户角色和连接用户数。我怎样才能实现这个目标!预先感谢您的帮助!

编辑:我现在可以使用托管 bean 中的命名查询来获取连接用户的角色:

public Users getUserRole(){
try {
Users auser = (Users)
em.createNamedQuery("Users.findByUsername").
setParameter("username", getRemoteUser()).getSingleResult();
return auser;
} catch (NoResultException nre) {
JsfUtil.addErrorMessage(nre, "getUserRole Error");
return null;
}

}

在 xhtml 页面中:

<h:outputLabel for="rolefacet" value="Role: "/>
<h:outputFormat id="rolefacet" value="#{UserBean.userRole.ugroup}" />

而ugroup是Users实体类中的角色名称。

<小时/>

编辑:一种对我来说仍然不起作用的解决方案是将 HttpSessionListener 添加到我的 web.xml 中:

package beans;

/**
*
* @author med81
*/

import java.io.Serializable;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.ArrayList;

import javax.faces.context.FacesContext;


public class SessionCounter implements Serializable, HttpSessionListener {

private List sessions = new ArrayList();
Object s = FacesContext.getCurrentInstance().getExternalContext().getSession(false);

public Object getS() {
return s;
}

public void setS(Object s) {
this.s = s;
}


public SessionCounter() {
}


public void sessionCreated(HttpSessionEvent event) {
HttpSession session = event.getSession();
sessions.add(session.getId());

session.setAttribute("counter", this);
}


public void sessionDestroyed(HttpSessionEvent event) {
HttpSession session = event.getSession();
sessions.remove(session.getId());

session.setAttribute("counter", this);
}

/**
*
* @return size of the session list
*/
public int getActiveSessionNumber() {
return sessions.size();
}


}

最佳答案

这是一个基本的启动示例,说明当您使用 Servlet 3.0 时如何执行此操作,从而能够通过新的 HttpServletRequest#login() API 使用编程登录。

登录表单:login.xhtml

<h:form>
<h:inputText value="#{user.username}" />
<h:inputSecret value="#{user.password}" />
<h:commandButton value="Login" action="#{user.login}" />
<h:messages />
</h:form>

用户管理器 bean:com.example.UserManager

@ManagedBean(name="user")
@SessionScoped
public class UserManager implements Serializable {

private String username;
private String password;
private User current;

@EJB
private UserService userService;

@ManagedProperty("#{loginManager.logins}")
private Set<User> logins;

public String login() {
FacesContext context = FacesContext.getCurrentInstance();
HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();

try {
request.login(username, password);
current = userService.find(username, password);
} catch (ServletException e) {
// Unknown login. Will be handled later in current==null check.
}

if (current == null) {
context.addMessage(null, new FacesMessage("Unknown login"));
return null;
} else {
logins.add(current)
return "home?faces-redirect=true";
}
}

public String logout() {
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
return "login?faces-redirect=true";
}

// ...
}

注销(和 session 无效)监听器:com.example.LogoutListener

@WebListener
public class LogoutListener implements HttpSessionListener {

@Override
public void sessionCreated(HttpSessionEvent event) {
// NOOP.
}

@Override
public void sessionDestroyed(HttpSessionEvent event) {
UserManager userManager = (UserManager) event.getSession().getAttribute("user");
if (userManager != null && userManager.getCurrent() != null) {
userManager.getLogins().remove(userManager.getCurrent());
}
}

}

(不要在 logout() 方法中执行此操作!这是 session 失效触发的,当 logout() 被执行时, session 失效将会发生 session 过期时调用 OR)

在任何登录 View 中,您都可以获取当前用户和登录计数,如下所示:

<p>Welcome, #{user.current.name}!</p>
<p>Total logged in users: #{user.logins.size()}</p>

关于jsf - 如何使用 j_security_check 获取已连接用户的数量及其角色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6141237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com