【问题标题】:How to redirect a logged out user to the home page in Java EE/JSF?如何将已注销的用户重定向到 Java EE/JSF 中的主页?
【发布时间】:2012-02-05 10:27:09
【问题描述】:

我需要只允许登录用户访问我的应用程序的大部分页面。 我正在使用 JSF 2 开发 Java 企业应用程序。 有谁知道我该怎么做?也许有一个配置文件?

我在主页中有一个登录组件,我希望用户在点击页面的任何其他项目时被重定向到主页。

【问题讨论】:

    标签: jsf redirect java-ee-6 web.xml logged


    【解决方案1】:

    有不同的方法可以做到这一点。首先,您可以使用过滤器来控制页面访问,或者您可以使用侦听 jsf 阶段的阶段侦听器。

    我想给你举两个例子;

      public class SecurityFilter implements Filter{
          FilterConfig fc;
    
       public void init(FilterConfig filterConfig)throws ServletException {
          fc = filterConfig;
       }
       public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
       throws IOException, ServletException{
          HttpServletRequest req = (HttpServletRequest)request;
          HttpServletResponse resp = (HttpServletResponse) response;
          HttpSession session = req.getSession(true);
    
          String pageRequested = req.getRequestURI().toString();
          if(session.getAttribute("user") == null && !pageRequested.contains("login.xhtml")){
             resp.sendRedirect("login.xhtml");
          }else{
            chain.doFilter(request, response);
          }
       }
       public void destroy(){
    
       }
    
    }
    

    您应该将此过滤器添加到 web.xml;

    <filter>
        <filter-name>SecurityFilter</filter-name>
        <filter-class>com.webapp.SecurityFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>SecurityFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    

    阶段监听器示例;

    public class SecurityFilter implements PhaseListener {
    
    
        public void beforePhase(PhaseEvent event) {
        }
    
        public void afterPhase(PhaseEvent event) {
          FacesContext fc = event.getFacesContext();
    
          boolean loginPage =
          fc.getViewRoot().getViewId().lastIndexOf("login") > -1 ? true : false;
            if (!loginPage && !isUserLogged()) {
                 navigate(event,"logout");
            }
        }
    
        private boolean isUserLogged() {
            //looks session for user 
        }
        private void navigate(PhaseEvent event, String page) {
           FacesContext fc = event.getFacesContext();
           NavigationHandler nh = fc.getApplication().getNavigationHandler();
           nh.handleNavigation(fc, null, page);
        }
        public PhaseId getPhaseId() {
            return PhaseId.RESTORE_VIEW;
        }
    
    }
    

    所以如果你想使用监听器,你应该把它添加到你的 faces-config.xml 中; 注意:“注销”是在 faces-config 中定义的导航规则

    <lifecycle>
     <phase-listener>com.myapp.SecurityFilter</phase>
    </lifecycle>
    

    编辑: 导航规则;

    <navigation-rule>
            <from-view-id>/*</from-view-id>
            <navigation-case>
                <from-outcome>logout</from-outcome>
                <to-view-id>/login.xhtml</to-view-id>
                <redirect/>
            </navigation-case>
        </navigation-rule>
    

    您可以使用类似的登录方法让您的用户进入会话;

    FacesContext context = FacesContext.getCurrentInstance(); 
    HttpSession session = 
    (HttpSession)context.getExternalContext().getSession(true); 
    
    session.setAttribute("user", loggedUser);
    

    【讨论】:

    • 谢谢 我会尝试第二个版本。我希望你能回答几个问题:SecurityFilter 是托管 bean 吗?如何让我的用户进入会话?以及如何声明“注销”导航规则?再次感谢。
    • Security Filter 不是托管 bean,只是一个实现 PhaseListener 接口的类。您可以在登录方法中让您的用户进入会话。我将举例说明我的答案
    • 谢谢!!!我正在尝试第二种解决方案,但我似乎无法找到正确的路径。我的侦听器位于名为 security 的文件夹中。 Web 模块称为 ExpUI,它位于名为 Experience 的应用程序中。所以我在我的 标签中使用这个路径 ExpUI.src.java.security.SecurityFilter 。你知道我做错了什么吗? ExpUI.src.java.security.SecurityFilter
    • 你应该创建包而不是文件夹。我们假设您在 Web 项目的源包下创建了一个名为 security 的包,您应该只将其写入您的阶段侦听器标签; security.SecurityFilter
    • 谢谢!!!!!!有用。我没有将用户置于会话中,而是检查托管 bean。但是,当它重定向页面时无法正确显示。你知道为什么吗?还有如何在未登录时只允许几个页面可见?非常感谢!!!!我的截止日期很近。
    【解决方案2】:

    有很多方法可以实现这一目标。最简单也可能是最流行的方法是使用 servlet 过滤器,您可以在此处找到有关这种机制的更多信息:Basic Security in JSF

    【讨论】:

      猜你喜欢
      • 2015-08-09
      • 1970-01-01
      • 2019-07-02
      • 2014-06-28
      • 2020-03-26
      • 1970-01-01
      • 2021-10-18
      • 2017-08-22
      • 2012-07-16
      相关资源
      最近更新 更多