【问题标题】:WebFilter urlPattern not workingWebFilter urlPattern 不起作用
【发布时间】:2013-04-18 01:06:59
【问题描述】:

我正在尝试将 WebFilter 与 JSF 2 一起使用,但我的过滤器无法正常工作。无法识别 urlPattern。

我的过滤器类:

@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 保持不变(http://jsftest.com:8080/TestePrimeFaces/faces/loginOK.xhtml)。是这个问题吗?

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

【问题讨论】:

  • 好的,这是因为我将代码编辑得更小了。问题是类没有执行。
  • 您不禁止使用 web.xml 进行注释扫描:<web-app metadata-complete="true"?尝试映射/* 并检查是否没有其他不以/ 开头的映射。
  • 我不明白你的第一个问题。如果我映射 /* 所有请求都通过过滤器
  • (1) 作为/* 的作品,这一点没有实际意义。 (可以使用metadata-complete="true".) (2) If war is called xxx.war, try /xxx/rws/*`(上下文根)抑制@WebFilter扫描。

标签: java jsf-2 servlet-filters


【解决方案1】:

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

FORWARD 调度程序添加到过滤器映射中,因为 Facelets 上的 JSF 不使用 RequestDispatcher#forward(),这与“普通”JSP/Servlet 和许多其他 MVC 框架不同。

如果要触发过滤器,只需通过重定向发送新请求即可。

所以,而不是

public String login() {
    // ...

    return "home";
}

只是做

public String login() {
    // ...

    return "home?faces-redirect=true";
}

如果您担心由于重定向导致面部消息丢失,只需使用 flash 范围即可。

另见:

【讨论】:

  • 谢谢,我会尝试并在此处发布结果。我不明白你在你的帖子最后说了什么,你能解释一下吗? “如果您担心由于重定向而导致面部信息丢失,请使用 flash 范围。”
  • 如果您将FacesContext#addMessage() 与重定向结合使用,则它们不会显示在重定向页面中。但是,如果您根本不添加任何面孔消息,请忽略答案的那一部分 :) 另请参阅“另请参阅”列表中的第 3 个链接以获取相关问题和答案。为了完整起见,我只是添加它。也许您使用的是context.addMessage(new FacesMessage("You're successfully logged in!")) 左右,这可能正是您不想首先发送重定向的原因。
  • 另一个问题,在这种情况下有什么更好的方法? WebFilter 还是 PhaseListener?我认为 PhaseListener 会使应用服务器过载。
  • servlet 过滤器肯定更好。阶段侦听器与 JSF 紧密耦合,不涵盖非 JSF 请求。授权绝对应该基于每个 HTTP 请求,而不是基于每个 JSF 视图。
【解决方案2】:

像这样添加“@Component”。

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

【讨论】:

    猜你喜欢
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 2018-12-30
    • 2013-10-07
    相关资源
    最近更新 更多