Java WebFilter URL模式不工作

Java WebFilter URL模式不工作,java,jsf-2,servlet-filters,Java,Jsf 2,Servlet Filters,我试图将WebFilter与JSF2结合使用,但我的过滤器不起作用。无法识别URL模式 我的筛选器类: @WebFilter(urlPatterns = {"/rws/*"}) public class AuthorizationFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain

我试图将WebFilter与JSF2结合使用,但我的过滤器不起作用。无法识别URL模式

我的筛选器类:

@WebFilter(urlPatterns = {"/rws/*"})  
public class AuthorizationFilter implements Filter {  

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

        if(o == null)   
            res.sendRedirect(req.getContextPath() + "/login.xhtml");  
        else
            chain.doFilter(request, response);  
    }  

    @Override  
    public void init(FilterConfig filterConfig) throws ServletException {  

    }  

    @Override  
    public void destroy() {  
    }  
}  
在我的结构中,我希望保护rws文件夹中的所有页面,但我无法配置过滤器

我试过了 @WebFilter(“/rws/*”) @WebFilter(“/faces/rws/*”)

我的过滤器从未执行过

我注意到,当我浏览网页时,url并没有改变。 例如,用户打开index.xhtml进行登录,然后重定向到loginOk.xhtml页面。 LoginOk.xhtml页面具有指向文件夹rws中的页面的链接

当我单击链接时,url不会改变,即,我正在浏览文件夹页面rws,但浏览器中的url保持不变()。这就是问题所在吗

使用commandLink作为链接,不知道它是否最合适。
有人知道问题出在哪里吗?

在回发时执行非重定向JSF导航时,不会触发Servlet过滤器。JSF导航在默认情况下不会创建新的HTTP请求(这将触发过滤器),但它只是更改HTTP响应的内容,同时仍然保持相同的HTTP请求(这也是为什么您在浏览器的地址栏中看不到更改的原因)

有些人可能会建议将
转发
调度程序添加到过滤器映射中,但这不会像Facelets上的JSF那样使用
请求调度程序#转发()
与“普通”JSP/Servlet和许多其他MVC框架不同

如果您想触发过滤器,只需通过重定向发送一个新请求

因此,与其

public String login() {
    // ...

    return "home";
}
照办

public String login() {
    // ...

    return "home?faces-redirect=true";
}
如果您担心由于重定向而丢失faces消息,只需使用flash范围即可

另见:
    • 像这样添加“@组件”

      @Component
      @WebFilter(urlPatterns = {"/rws/*"})  
      public class AuthorizationFilter implements Filter { ...
      

      好的,这是因为我编辑了代码以使其变小。问题是没有执行该类。您没有使用web.xml禁止注释扫描:
      我不理解您的第一个问题。如果I mapping/*所有请求都在
      /*
      工作时通过过滤器(1),则该点没有意义。(可以使用
      metadata complete=“true”抑制
      @WebFilter
      扫描)(2)如果war被称为xxx.war,请尝试使用
      /xxx/rws/*`(上下文根)。可能重复感谢,我将尝试并在此处发布结果。我不明白你在文章末尾说了什么,请你解释清楚好吗?“如果您担心由于重定向而丢失faces消息,请使用flash scope。”如果将
      FacesContext\addMessage()
      与重定向结合使用,则它们不会显示在重定向页面中。但是,如果你根本没有添加任何faces消息,只需忽略答案的这一部分:)另请参见“请参见”列表中的第3个链接,以获取相关问题和答案。我只是为了完整起见才添加它。也许您使用的是
      context.addMessage(new FacesMessage(“您已成功登录!”)
      等等,这可能正是您不想首先发送重定向的原因。另一个问题,在这种情况下有什么更好的方法?WebFilter还是PhaseListener?我认为PhaseListener会使应用服务器过载。servlet过滤器肯定更好。阶段侦听器与JSF紧密耦合,不覆盖非JSF请求。授权绝对应该基于每个HTTP请求进行,而不是基于每个JSF视图。