我有一个带有登录屏幕的网络应用程序,由身份验证过滤器备份。
我的web.xml中有以下内容
<filter>
<filter-name>AuthenticationFilter</filter-name>
<display-name>AuthenticationFilter</display-name>
<filter-class>com.mycompany.secutity.AuthenticationFilter</filter-class>
</filter>
我有以下映射 -
<filter-mapping>
<filter-name>AuthenticationFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
但现在我想添加一个异常,对于特定的servlet /web/MyNewServlet
,我想绕过验证过滤器。我们怎么做到这一点?
答案 0 :(得分:6)
有两种方法可以做到这一点:
/*
模式重新映射到/subdir/*
等其他模式,从而避免将AuthenticationFilter应用于/web/MyNewServlet
。这是一个繁琐的过程,因为您的Web应用程序中可能有多个URL现在需要重新映射。我建议您在开发的早期或在没有太多网址重新映射的情况下这样做。HttpServletRequest.getServletPath
和类似的方法来验证URL片段是否包含/web/MyNewServlet
,然后将过滤器链接到下一个过滤器或servlet,而不是执行过滤器的主体。答案 1 :(得分:4)
稍微扩展Vineet的想法,您可以添加另一个过滤器,称为DoesNotNeedAuthenticationFilter,它在AuthenticationFilter之前运行,并且只在请求上设置属性DOES_NOT_NEED_AUTHENTICATION。然后,AuthenticationFilter可以检查该属性,并传递拥有该属性的任何请求。然后,您可以使用常规过滤器映射机制将DoesNotNeedAuthenticationFilter应用于相应的URL或servlet。