我正在尝试将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 / *”)
我的过滤器永远不会执行!!
我注意到浏览页面时网址没有变化。 例如,用户打开index.xhtml执行登录,然后重定向到页面loginOk.xhtml。 LoginOk.xhtml页面包含指向rws文件夹中页面的链接。
当我点击链接时,网址没有变化,即我正在浏览文件夹页面rws,但浏览器中的网址保持不变(http://jsftest.com:8080/TestePrimeFaces/faces/loginOK.xhtml)。这是问题吗?
使用commandLink作为链接,不知道它是否是最合适的。 有谁知道问题在哪里?
答案 0 :(得分:1)
在回发时执行非重定向JSF导航时,不会触发Servlet过滤器。 JSF导航默认情况下不会创建新的HTTP请求(这将触发过滤器),但它只是更改HTTP响应的内容,同时仍保持相同的HTTP请求(这也正是您没有看到更改的原因)浏览器的地址栏)。
将FORWARD
调度程序添加到过滤器映射中,因为有些人可能会建议这些调度程序不起作用,因为Facelets上的JSF不使用RequestDispatcher#forward()
,而不像“普通”JSP / Servlet和许多其他MVC框架。 / p>
如果您想触发过滤器,只需通过重定向发送新请求。
所以,而不是
public String login() {
// ...
return "home";
}
只是做
public String login() {
// ...
return "home?faces-redirect=true";
}
如果您担心由于重定向而丢失了面部消息,请使用闪存范围。
答案 1 :(得分:0)
像这样添加“ @Component”。
@Component
@WebFilter(urlPatterns = {"/rws/*"})
public class AuthorizationFilter implements Filter { ...