项目中有多个工程通过HTTP请求的方式通信的需求。其中一个工程配置了单点登录功能,会拦截所有的请求,检验session值。通过后台进行的通信没有发送session值,就会被拦截下来。于是上网找了相关资料,如何让一些请求跳过单点的过滤器。大致意思是,配置一个过滤器,对有指定前缀的请求进行过滤,过滤处理时让其断掉后续过滤器链,直接转发给Servlet进行处理。
综合起来整理了一下代码。
参考网址1:http://88250.b3log.org/how-to-skip-filters-in-java
参考网址2:http://www.blogjava.net/youngturk/archive/2013/07/12/401496.html
一、创建一个Filter接口的实现类。
public class AlarmFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
String servletPath = request.getServletPath();
System.out.println("进入过滤");
request.getRequestDispatcher(servletPath).forward(request, response);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
二、配置web.xml,在所有的过滤器之前添加一下过滤器配置
<filter>
<filter-name>AlarmFilter</filter-name>
<filter-class>
xjgz.by.scity.listener.AlarmFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>AlarmFilter</filter-name>
<url-pattern>/Alaram/*</url-pattern>
</filter-mapping>
三、提供访问的接口配置注解
@Controller
@RequestMapping("/Alaram")
综上所述,“http://IP:port/项目名/Alaram/sendAlaramNo.do”这样的请求会被“AlarmFilter”过滤,然后直接转发给Servlet。