Java WebFilter URL模式不工作
我试图将WebFilter与JSF2结合使用,但我的过滤器不起作用。无法识别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(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视图。