gpt4 book ai didi

java - WebFilter urlPatterns 被忽略

转载 作者:行者123 更新时间:2023-11-30 05:51:12 25 4
gpt4 key购买 nike

虽然我似乎有它们的“精确”副本,但我已经阅读了很多示例,所以我无法弄清楚为什么当我导航到 /login 而不是 /时我的过滤器会执行限制/*。我已尝试使用注释(如下例所示)和 XML 来定义 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() {
}
}

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>

注意

即使在两个文件中都定义了过滤器,我可以保证我不会同时使用这两种表示法。然而,为了测试和审查,我确实将它们都发布了。

我是网络过滤器的新手,找不到太多关于使用多个过滤器的信息。但我确实读到了,您可以使用多个,它们将按照您在 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>

您基本上是在指示过滤器应该在 FacesServlet 出现时被调用。每当 URL 模式与 /restricted/* 匹配时将被调用 .

这不是您所期望的“和”条件。只需删除 <servlet-name>条目。

正确的@WebFilter声明将是

@WebFilter("/restricted/*")

假设您不需要 <filter-mapping> (例如,如果顺序无关紧要)。

关于java - WebFilter urlPatterns 被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13019779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com