Men*_*nno 2 java jsf url-pattern servlet-filters
我已经阅读了很多例子,虽然我似乎有一个'确切'的副本,所以我无法弄清楚为什么我的过滤器将导航到/login而不是/restricted/*.我已经尝试了两个注释(如下例所示)和XML来定义WebFilter.
Webfilter
@WebFilter(filterName = "AuthenticationFilter", servletNames = { "Faces Servlet" }, urlPatterns = { "/restricted/*" } )
public class AuthenticationFilter implements Filter {
@Inject
private SessionManager sessionManager;
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("Active AuthenticationFilter");
if (sessionManager.getUser() == null) {
((HttpServletResponse) response).sendRedirect("/login");
}
else {
chain.doFilter(request, response);
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
Run Code Online (Sandbox Code Playgroud)
web.xml中
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<filter>
<filter-name>Pretty Filter</filter-name>
<filter-class>com.ocpsoft.pretty.PrettyFilter</filter-class>
<async-supported>true</async-supported>
</filter>
<filter-mapping>
<filter-name>Pretty Filter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
<dispatcher>ASYNC</dispatcher>
</filter-mapping>
<filter>
<filter-name>NoCacheFilter</filter-name>
<filter-class>filter.NoCacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>NoCacheFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>AuthenticationFilter</filter-name>
<filter-class>filter.AuthenticationFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthenticationFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/restricted/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
注意
即使过滤器是在两个文件中定义的,我也可以保证我不会同时使用这两种符号.为了测试和审查,我确实发布了它们.
我是webfilters的新手,并且对使用多个过滤器一无所知.但是我读过的内容,您可以使用多个,它们将按您定义的顺序执行web.xml.
题
有没有人知道为什么我的过滤器也会在页面上执行/login?该应用程序在Glassfish 3.1.2上运行.
该<filter-mapping>匹配条件不包容,他们是排斥的.
使用以下映射
<filter-mapping>
<filter-name>AuthenticationFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/restricted/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
你基本上是指示每当FacesServlet要调用或每当URL模式匹配时都应该调用过滤器/restricted/*.
这不是你所期待的"和"条件.只需删除该<servlet-name>条目.
然后适当的@WebFilter声明
@WebFilter("/restricted/*")
Run Code Online (Sandbox Code Playgroud)
假设您不需要<filter-mapping>(例如,如果订单无关紧要).
| 归档时间: |
|
| 查看次数: |
9505 次 |
| 最近记录: |