3

我正在尝试将 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作为链接,不知道是不是最合适。有谁知道问题出在哪里?

4

2 回答 2

4

像这样添加“@Component”。

@Component
@WebFilter(urlPatterns = {"/rws/*"})  
public class AuthorizationFilter implements Filter { ...
于 2019-04-04T05:25:18.960 回答
1

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

正如一些人可能建议的那样,将调度程序添加FORWARD到过滤器映射将不起作用,因为 Facelets 上的 JSFRequestDispatcher#forward()不像“普通”JSP/Servlet 和许多其他 MVC 框架那样使用。

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

所以,而不是

public String login() {
    // ...

    return "home";
}

做就是了

public String login() {
    // ...

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

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

也可以看看:

于 2013-04-25T01:18:54.070 回答