Filter过滤顺序
来源:互联网 发布:淘宝恒天然wpc80分装 编辑:程序博客网 时间:2024/06/07 13:29
多个Filter过滤顺序
当存在两个Filter:filter1和filter2,两个filter过滤URL相同,此时的过滤顺序为:
在web.xml中,的配置顺序则为两个过滤器的过滤顺序。
filter1--->filter2--->doFilter---->filter2---->filter1这种情况下,如果第二个过滤器需要得到第一个过滤器过滤之后的一些数据,则会出现空指针异常。此时我们可以先让第一个过滤器返回,因为当存在几个过滤器只有遇到doFilter时,才会放行,也就是说才会完整的运行一次。doFilter这个方法就是一个阀值。如果要使第一个filter先完整执行,则在第二个过滤器中,当第一个过滤进入之后,若我们并没有获取需要的数据,即直接调用doFilter()方法。此时就将返回到第一个过滤器之中。
以下通过实际代码说明两个filter的执行顺序:
第一个过滤器,为过滤登录地址,和是否登录。
`public class RestAuthenticationFilter implements Filter {public void destroy() {}public void init(FilterConfig arg0) throws ServletException {}public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; logAccessAPI(request); String requestURI = request.getRequestURI(); if (requestURI.endsWith("/filter/login")) { **system.out.println( login before);** **chain.doFilter(request, response);** **System.out.println( login after);** return; } Object personId = request.getSession().getAttribute("personid"); if (null != personId && StringUtils.isNotBlank((String) personId.toString())) { **system.out.println( login before);** **chain.doFilter(request, response);** **System.out.println( login after);** return; } else { response.setContentType("application/json;"); ServletOutputStream sos = response.getOutputStream(); sos.write("{\"flag\":false,\"msg\":\"session timeout, need login\",\"data\":[{}]}".getBytes()); }}
第二个过滤器:过滤请求的参数是否正常,是否符合自己要求。
public class DataAuthenticationFilter implements Filter{@Overridepublic void destroy() {}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; long start = System.currentTimeMillis(); Enumeration<String> paramter = req.getParameterNames(); if (paramter == null || !(FindEnum(paramter))) { **system.out.println( DataAuth before);** chain.doFilter(req, res); **system.out.println( DataAuth after); long end = System.currentTimeMillis(); System.out.println( end - start ); return; } String[] site_id = ((String) req.getSession().getAttribute("siteId")).split("\|"); List<String> site = Arrays.asList(site_id); String site_id_check = req.getParameter("site_id"); if (site_id_check != null){ List<String> site_check = Arrays.asList(site_id_check.split(",")); if (site.containsAll(site_check) && site_check != null){ chain.doFilter(req, res); long end = System.currentTimeMillis(); System.out.println( end - start ); return; } } response.setContentType("application/json;"); ServletOutputStream sos = response.getOutputStream(); sos.write("{\"flag\":false,\"msg\":\"site_id invalid \",\"data\":[{}]}".getBytes()); long end = System.currentTimeMillis(); System.out.println( end - start ); return;}private boolean FindEnum(Enumeration<String> paramter){ for(Enumeration<String> e=paramter;e.hasMoreElements();){ if(e.nextElement().toString().equals("site_id")) return true; } return false;}}
Web.xml
在web.xml中我们的配置为:<filter> <filter-name>restAuthenticationFilter</filter-name> <filter-class>com.envision.envservice.filter.RestAuthenticationFilter</filter-class></filter><filter> <filter-name>dataAuthenticationFilter</filter-name> <filter-class>com.envision.envservice.filter.DataAuthenticationFilter</filter-class></filter><filter-mapping> <filter-name>restAuthenticationFilter</filter-name> <url-pattern>/services/*</url-pattern></filter-mapping><filter-mapping> <filter-name>dataAuthenticationFilter</filter-name> <url-pattern>/services/*</url-pattern></filter-mapping>
如果第一次我们请求的资源地址为:http://127.0.0.1:8080/filter/services/login
此时打印输出的信息为:
login beforeDataAuth beforedoFilterDataAuth afterlogin after
过滤顺序即可以看出是什么顺序,也我们必要的时候,也可以控制他先将某些过滤器“跳过”
0 0
- Filter过滤顺序
- Filter的过滤顺序
- filter过滤
- filter过滤
- filter过滤、servlet过滤
- Servlet filter过滤RequestDispatcher.forward内部转发, 及FilterChain.doFilter的顺序
- 关于filter 过滤
- Filter过滤非法字符
- java Filter 权限过滤
- 使用filter过滤请求
- 动态数据过滤Filter
- 使用filter过滤请求
- 过滤字符串filter
- 使用filter过滤请求
- filter 登录过滤笔记
- ClientDataSet过滤功能Filter
- Ehlib DBGrideh Filter 过滤
- filter过滤说明
- 【翻译搬运】一个基于css3的图片轮换程序
- git学习总结(四)
- hadoop2.6.0 完全分布式安装
- Golang中new和make的区别
- 理解Go语言中的函数闭包
- Filter过滤顺序
- iOS9微信QQ微博SDK需要在plist加的字段
- javascript 函数详解
- 关于Vim的使用:如何更改默认字体和取消自动备份
- .NET伪静态配置方法(其一)
- 1.2 日期函数
- 关于SOCKET 接收发送 缓冲区 测试 SO_SNDBUF
- 关于程序无法下载的感悟
- Java 内存区域和GC机制以及JVM(Java虚拟机)优化大全和案例实战