1

我的项目有一个模板main.xhtml和三个视图login.xhtml, dashboard.xhtml, new.xhtml. 一旦我登录login.xhtmlLoginBean将验证,如果成功,则将需要dashboard.xhtml。如果用户需要创建一个新记录,他点击新按钮new.xhtml

但问题是,如果dashboard.xhtml直接从浏览器请求,则无需登录即可工作。我需要检查用户登录的每个视图吗?我怎样才能做到这一点?

4

1 回答 1

1

听起来好像您正在进行家庭认证。在这种情况下,您还需要自制访问限制。这通常使用servlet 过滤器来完成。

假设您在@RequestScopedbean 中按如下方式登录,

public String login() {
    User user = userService.find(username, password);
    FacesContext context = FacesContext.getCurrentInstance();

    if (user != null) {
        context.getExternalContext().getSessionMap().put("user", user);
        return "dashboard.xhtml?faces-redirect=true";
    } else {
        context.addMessage(null, new FacesMessage("Unknown login, try again."));
        return null;
    }
}

然后您可以在过滤器中检查登录用户,@WebFilter("/*")如下所示:

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {    
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    HttpSession session = request.getSession(false);

    User user = (session != null) ? session.getAttribute("user") : null;
    String loginURL = request.getContextPath() + "/login.xhtml";

    boolean loginRequest = request.getRequestURI().startsWith(loginURL);
    boolean resourceRequest = request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER);

    if (user != null || loginRequest || resourceRequest)) {
        chain.doFilter(request, response);
    } else {
        response.sendRedirect(loginURL);
    }
}

因此请注意,当用户登录时,或者直接请求登录页面本身时,或者请求 JSF 资源(CSS/JS/图像)时,这将继续请求。

如果您使用的是容器管理的身份验证,则不需要过滤器。另请参阅如何处理数据库中用户的身份验证/授权?

于 2013-01-24T10:54:39.487 回答