过滤器&拦截器

Filter:(Servlet)
主要用途:
1.在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest(检查和修改HttpServletRequest头和数据)
2.在HttpServletResponse到达客户端之前,拦截客户的HttpServletResponse(检查和修改HttpServletResponse头和数据)
例如:设置字符集,控制权限,控制转向,做一些业务逻辑判断等

工作原理:只要你在web.xml文件配置好要拦截客户端请求,它都会帮你拦截到;
它随你的web应用启动而启动,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或者重新部署的时候才销毁

创建Filter(实现了下面的接口):
1.创建Filter处理类
2.web.xml文件中配置Filter

javax.servlet.Filter接口中的三个方法:
1.void init(FilterConfig config):用于完成Filter的初始化.
2.void destory():用于Filter销毁之前,完成某些资源的回收
3.void doFilter(ServletRequest request,ServletResponse response,FilterChain chain):实现过滤功能,该方法就是对每个请求及响应增加的
额外处理.调用了chain.doFilter(),执行该方法之前(对用户的请求进行预处理);执行该方法之后(对服务器响应进行后处理)

Intercepter:(Spring)
说明:拦截器是面向切面编程的应用,是AOP的一种实现策略,是基于JAVA反射机制!!!(就是在你的service或者一个方法前或后调用一个方法(即各种通知))
应用:在springMVC中定义一个Intercepter的两种方式(其中的三个方法是链式调用)
方式一:定义的Intercepter类要实现或者继承spring的HandlerIntercepter接口
方式二:定义的Intercepter类要实现或继承spring的WebRequestInterceptor接口


(Spring的Interceptor和Servlet的Filter有相似之处,比如二者都是AOP编程思想的体现,都能实现权限的检查.日志的记录)
两者的区别:
Filter是Servlet规定规范的,是Servlet容器支持,定义在web.xml;-----javax.servlet----只在Servlet前后起作用,是被Servlet调用的,不能使用Spring容器
(Interceptor)是Spring容器内的,是Spring框架支持的-----org.springframework.web.servlet-----既可以用于web程序,也可以用于Application/Swing程序中
在Spring架构的程序中,要优先使用拦截器.几乎所有Filter能够做的事情,interceptor都能轻松实现

两者执行顺序:
过滤前----拦截前----Action处理----拦截后----过滤后
拦截器的执行顺序:
1.请求到达DispatcherServlet
2.DispatcherServlet发送到Interceptor,执行preHandle
3.请求到达Controller
4.请求结束后,postHandle执行

总结:
过滤器:在java web中,你传入的request/response提前过滤掉一些信息,或者提前设置一些参数,然后在传入servlet或者struts的action进行业务逻辑,
比如:过滤掉非法url(不是login.do的地址请求,如果用户没有登录过都过滤掉),或者在传入servlet或者struts的action前统一设置字符集,或者去除
一些非法字符(聊天室的一些骂人的话),filter流程是线性的,Url传来之后,检查之后,可以保持原来的流程继续向下执行,被下一个filter/servlet接收
拦截器:主要用在插件上,面向切面的技术,在使用前要在配置文件即xml文件里声明一下

猜你喜欢

转载自www.cnblogs.com/slfeng/p/11070682.html