一、过滤器
1.1、产生背景
在基于JSP页面开发的Web项目中,会遇到一种情况,除了登陆页面或者注册页面以外,其它页面在用户未登陆的情况下是不允许访问的。对用户身份的验证是基于session实现的,即在登陆成功后在session中放入标识,当用户再次访问其它页面时,根据session的标识来确认用户是否可以访问,这样的话,在很多页面中都需要添加判断代码,同样代码的重复增加了多余的代码,不符合Java编程习惯且不利于维护。而过滤器的产生解决了这一问题。
1.2、概述
Filter是Sevlet2.3之后增加的新功能,当需要限制用户访问某些资源或者在处理请求时提前处理某些资源时,即可使用过滤器完成。比如如果用户去看演唱会,肯定需要购门票,那么过滤器就好比那些检票人员,如果是有票的游客(合法用户)则可以进去看演唱会,如果没有票的(非法用户),则不能看演唱会。还比如只想在一堆东西里面挑选出B。
1.3、实现
创建一个Filter只需两个步骤
1)创建Filter处理类;
2)web.xml文件中配置Filter。
创建Filter必须实现javax.servlet.Filter接口,在该接口中定义了如下三个方法。
void init(FilterConfig config):用于完成Filter的初始化。
void destory():用于Filter销毁前,完成某些资源的回收。
void doFilter(ServletRequest request,ServletResponse response,FilterChain chain):实现过滤功能,该方法就是对每个请求及响应增加的额外处理。该方法可以实现对用户请求进行预处理(ServletRequest request),也可实现对服务器响应进行后处理(ServletResponse response)—它们的分界线为是否调用了chain.doFilter(),执行该方法之前,即对用户请求进行预处理;执行该方法之后,即对服务器响应进行后处理。
1.4、应用场景
所谓过滤器顾名思义是用来过滤的,将不满足条件的请求过滤走,满足条件的继续执行。Java的过滤器能够为我们提供系统级别的过滤,也就是说,能过滤所有的web请求,这一点,是拦截器无法做到的。
1)、权限判断:比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉)
2)、预备参数信息处理:在Java Web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的action进行业务逻辑。比如在传入servlet或者struts的action前统一设置字符集,或者去除掉一些非法字符(聊天室语言合法性过滤)。
注意:过滤器的缺点是一个过滤器实例只能在容器初始化时调用一次。
OncePerRequestFilter
二、拦截器
2.1、产生背景
Web项目中需要判断http接口用户Post上来的数据是否合法,如果不合法要另做处理,用户Post上来的数据是Json形式的,我们用了@RequestBody标记自动将json形式的提交封装为一个Model对象,这样一来,我们就不能判断在自动封装过程中是否出现了异常,此时便想起了springMVC中的interceptor,用于处理请求之前,做一些处理,我们可以取消@RequestBody标记,然后在interceptor中取得请求体,检查是否符合json要求,即是不是一个valid interceptor,但是这里出现了一个问题:
httpServletRequest的请求内容,只能被读取一次,在interceptor中读取了的话,在controller中便不能读取了,解决方式是,读取到的请求内容存起来,然后在controller中直接使用。
2.2、概述
拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。比如把水流变小,把鱼拦住,顺便发个电。
2.3、应用场景
1)、日志记录:可以记录请求信息的日志,以便进行信息监控、信息统计等。
2)、权限检查:如登录检测,进入处理器检测是否登录,如果没有直接返回到登录页面。
3)、性能监控:典型的是慢日志。
三、Filter和Interceptor的执行顺序
过滤前-拦截前-action执行-拦截后-过滤后
四、拦截器(intercept)和过滤器(filter)的区别
五、总结
过滤器就是筛选出你要的东西,比如requeset中你要的那部分
拦截器在做安全方面用的比较多,比如终止一些流程。
备注:
Servlet容器:
同时一个拦截器实例在一个controller生命周期之内如何被多次调用?
网友评论