我正在开发一个平针项目,我使用令牌身份验证,并使用ContainerRequestFilter过滤所有请求并检查它是否有令牌,但请求包括登录和注册请求,但我们需要跳过这些请求。 。我如何跳过登录和注册请求的过滤?为了达到这个目的,球衣中是否有任何机制?
谢谢
答案 0 :(得分:0)
据我所知,使用原始部署描述符( web.xml )没有这种行为的设施。
但是,如果这是自定义过滤器,您可以使用doFilter()
方法中的简单检查请求网址,跳过排除路径。但是,由于您使用的是第三方过滤器,因此无法实现这一目标,但仍可实现此功能:
将您的第三方过滤器(ContainerRequestFilter
)映射更改为另一个路径而不是通配符:
<filter-mapping>
<filter-name>containerRequestFilter</filter-name>
<url-pattern>/tokenizedpaths/*</url-pattern>
</filter-mapping>
声明一个新的过滤器(稍后会看到它的样子),它将映射到通配符路径以过滤所有请求,并被委派给 containerRequestFilter 仅当请求路径与排除的路径不匹配时(我选择 register 作为样本):
<filter>
<filter-name>filteringFilter</filter-name>
<filter-class>com.sample.FilteringServletFilter</filter-class>
<init-param>
<param-name>excludedPaths</param-name>
<param-value>/register</param-value>
</init-param>
</filter>
FilteringServletFilter
看起来像下面的内容:
public class FilteringServletFilter implements Filter {
private List<String> excludedPaths = new ArrayList<String>();
public void init(FilterConfig config) throws ServletException {
// You can declare a comma separated list to hold your excluded paths
this.excludedPaths = Arrays.asList(config.getInitParameter("excludedPaths").split(","));
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
String path = ((HttpServletRequest) request).getRequestURI();
// If the url is one of excluded paths, then just continue with next filter
if (this.excludedPaths.contains(path)) {
chain.doFilter(request, response);
return;
}
// Otherwilse, forward the request to the needed filter
else {
request.getRequestDispatcher("/tokenizedpaths" + path).forward(request, response);
}
}
}