Java Primefaces登录应用程序

Java Primefaces登录应用程序,java,jsf,jakarta-ee,web-applications,primefaces,Java,Jsf,Jakarta Ee,Web Applications,Primefaces,可能重复: 我正在使用Primefaces实现我的web应用程序。在我的实现中,用户可以登录到系统,然后他们可以通过复制URL重新加载重定向页面,而无需再次登录。我怎样才能防止这种情况 以下是我的登录逻辑: public String doLogin() { if(username != null && username.equals("admin") && password != null &&

可能重复:

我正在使用Primefaces实现我的web应用程序。在我的实现中,用户可以登录到系统,然后他们可以通过复制URL重新加载重定向页面,而无需再次登录。我怎样才能防止这种情况

以下是我的登录逻辑:

public String doLogin() {
    if(username != null  &&
        username.equals("admin") &&
        password != null  &&
        password.equals("admin")) {
        msg = "table?faces-redirect=true";
    } else
        if(user_name.contains(username) &&
            pass_word.contains(password) &&
            !user_name.contains("admin")) {
            msg = "table1?faces-redirect=true";
        }
    }
    return msg;
}

如果用户会话尚未过期,则这是web应用程序的正常行为。如果会话已过期,则必须确保有已登录的用户,并且该用户具有访问他/她在URL中使用的页面的权限。您可以使用过滤器来实现这一点

我假设您的web应用程序位于Java EE 6容器上,如Tomcat 7或GlassFish 3.x:

@WebFilter(filterName = "MyFilter", urlPatterns = {"/*.xhtml"})
public class MyFilter implements Filter {

    public void doFilter(
        ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {

        //get the request page
        String requestPath = httpServletRequest.getRequestURI();
        if (!requestPath.contains("home.xhtml")) {
            boolean validate = false;
            //getting the session object
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;
            HttpSession session = (HttpSession)httpServletRequest.getSession();
            //check if there is a user logged in your session
            //I'm assuming you save the user object in the session (not the managed bean).
            User user = (User)session.get("LoggedUser");
            if (user != null) {
                //check if the user has rights to access the current page
                //you can omit this part if you only need to check if there is a valid user logged in
                ControlAccess controlAccess = new ControlAccess();
                if (controlAccess.checkUserRights(user, requestPath)) {
                    validate = true;
                    //you can add more logic here, like log the access or similar
                }
            }
            if (!validate) {
                HttpServletResponse httpServletResponse = (HttpServletResponse) response;
                httpServletResponse.sendRedirect(
                    httpServletRequest.getContextPath() + "/home.xhtml");
            }
        }
        chain.doFilter(request, response);
    }
}
ControlAccess类的一些实现:

public class ControlAccess {

    public ControlAccess() {
    }

    public boolean checkUserRights(User user, String path) {
        UserService userService = new UserService();
        //assuming there is a method to get the right access for the logged users.
        List<String> urlAccess = userService.getURLAccess(user);
        for(String url : urlAccess) {
            if (path.contains(url)) {
                return true;
            }
        }
        return false;
    }
}
公共类控制访问{
公共控制访问(){
}
公共布尔checkUserRights(用户,字符串路径){
UserService UserService=new UserService();
//假设有一种方法可以为登录的用户获得正确的访问权限。
列表urlAccess=userService.getURLAccess(用户);
for(字符串url:urlAccess){
if(path.contains(url)){
返回true;
}
}
返回false;
}
}

在寻找一种很好的解释方法时,我从BalusC(JSF专家)那里找到了一个更好的答案。这是基于JSF 2的:

您可以采取措施保护内部页面不被未经身份验证的用户访问


您还可以让容器使用JDBC领域身份验证为您处理身份验证,如

中所示,非常感谢。但我不会在会话中保存用户对象。我如何做到这一点?如何控制用户是否登录/退出应用程序?用户是否登录/退出应用程序没有任何控制。我也没有你能帮我解决我的问题吗?用很好的例子和很好的解释。非常感谢。这里发布的代码非常直观。我会添加更多信息,让你参与这些事情。在未来的项目中,出于安全原因,您必须控制哪个用户访问您的应用程序。好的。感谢Luggie先生的宝贵意见。您的答案包含在BALUCC答案中。我建议你读一下。@LuiggiMendoza谢谢你,我刚刚注意到你的更新。我还更新了我的答案。:)第二个选项是一个很好的方法,但看起来OP不会用数据库验证用户。