打开/home.xhtml时,不会调用映射在/ home上的Servlet过滤器

时间:2013-04-18 18:47:24

标签: jsf login servlet-filters

我是Java Enterprise Edition的新手。我开始从一些YouTube视频中学习,最近开始阅读http://docs.oracle.com/javaee/6/tutorial/doc/我完成了第15章。

我试着制作自己的过滤器。

我没有使用Java Servlet类。因为我想使用JSF页面,据我所知,只能使用带有JSF页面的Managed Beans,而Servlet类可以使用JSP。没关系。

据我所知,登录过滤器的用处: https://stackoverflow.com/tags/servlet-filters/info

  

[...]当您有多个页面时,此功能特别有用   您想查看已登录的用户。而不是copypasting   所有页面上的逻辑相同,您可以使用过滤器将其整合在一起   的地方。

当用户在浏览器中为需要登录用户的页面直接输入 URL 时,它非常有用(因为我知道),因此过滤器会将他重定向到登录页面如果他已登录,则继续。

我搜索了任何可以学习但没有找到的简单例子。我将举一个简单的例子:

我有两个JSF页面 一个名为home.xhtml(需要登录用户)
另一个名为login.xhtml(如果非登录用户寻求回家,过滤器必须重定向到它)

login.xhtml:

  <h:form>
     <h:panelGrid columns="2">
     <h:outputLabel value="name:"/> <h:inputText value="#{user.name}"/>
     <h:outputLabel value="password:"/> <h:inputSecret value="#{user.password}"/>
     </h:panelGrid>
     <h:commandButton id="btn"  value="login" action="#{user.login()}"/>
  </h:form>

home.xhtml:

<h:body>
   Hello #{user.name}. You are welcome
</h:body>

用户:

@ManagedBean
@SessionScoped
public class User implements Serializable
{
   String name;
   String password;
   Authentication authentication;

   public User()
   {
      authentication = new Authentication();
   }

    //Getters and Setters for name and password.

   public String login()
   {
      if (this.getName().equals("user") &&(this.getPassword().equals("1234")))
      {
         authentication.setLoggedIn(true);
         FacesContext context = FacesContext.getCurrentInstance();
         context.getExternalContext().getSessionMap().put("auth", authentication);
         return "home";
      }
      else
      {
         authentication.setLoggedIn(false);
         FacesContext context = FacesContext.getCurrentInstance();
         context.getExternalContext().getSessionMap().put("auth", authentication);
         return "login";
      }
   }
}

验证

@ManagedBean
@SessionScoped
public class Authentication implements Serializable
{

   private boolean authenticated;

   public Authentication()
   {
      authenticated = false;
   }

   public boolean isLoggedIn()
   {
      return authenticated;
   }

   public void setLoggedIn(boolean authenticated)
   {
      this.authenticated = authenticated;
   }

}

LoginFilter:

@WebFilter(value = "/home")
public class LoginFilter implements Filter
{

   @Override
   public void init(FilterConfig filterConfig) throws ServletException
   {
      //throw new UnsupportedOperationException("Not supported yet.");
   }

   @Override
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException
   {
      HttpServletRequest req = (HttpServletRequest) request;
      Authentication auth = (Authentication) req.getSession().getAttribute("auth");

      if (auth != null && auth.isLoggedIn())
      {
         System.out.println("Filter is working");
         chain.doFilter(request, response);
      } else
      {
         System.out.println("Filter is working");
         HttpServletResponse res = (HttpServletResponse) response;
         res.sendRedirect(req.getContextPath() + "/login.xhtml");
      }
   }

   @Override
   public void destroy()
   {
      //throw new UnsupportedOperationException("Not supported yet.");
   }
}

面-配置:

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

的web.xml:

<context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/login.xhtml</welcome-file>
    </welcome-file-list>

现在,当我在浏览器中键入home.xhtml页面的网址(清除历史记录和Cookie后)后,我会将其重定向到登录页面。但它改为回家,名称为空值:
Hello #{user.name}. You are welcome呈现为Hello . You are welcome

即使System.out.println("Filter is working");也没有打印任何内容。

1 个答案:

答案 0 :(得分:1)

你确定过滤器被调用了吗?如果没有任何内容打印到System.out,我猜不会。问题可能是servlet映射。

你指定了这个:

@WebFilter(value = "/home")
public class LoginFilter implements Filter {...}

我认为这只会与网址/home匹配。请尝试使用/*/home*(这是非常有限的,我不建议使用)。

另一件事:如果输出Hello #{user.name}. You are welcome,则可能不会调用FacesServlet。这可能有两个原因:

  1. 您使用错误的映射。尝试使用/faces/home.xhtml/home.jsf来调用该页面。该网址取决于您在web.xml
  2. 中的映射类型
  3. FacesServlet中未正确配置web.xml