首页 > 编程知识 正文

过滤器与拦截器的区别,过滤器和拦截器哪个先执行

时间:2023-05-04 00:56:45 阅读:173525 作者:3721

一、拦截器和过滤器的区别

1、拦截器只对操作请求起作用,即对外访问路径

过滤器(Filter )适用于几乎所有请求,包括资源文件(如css js )

2、拦截器在servlet和Controller控制器之间运行

在请求访问Tomcat容器后,在请求访问servlet前执行过滤器(Filter )

web.xml加载顺序:无论何时请求结束并返回,context-param-listener-filter-servlet都会在处理完servlet后返回前端时执行

二.拦截器和过滤器的代码实现

1、拦截器

首先需要一个拦截器类,该类必须实现HandlerInterceptor接口

这个界面有三种方法。

@ overridepublicbooleanprehandle (httpservletrequestrequest,HttpServletResponse response, 对象handler ) throws exception {//} @ overridepublicvoidposthandle (httpservletrequestrequest,HttpServletResponse response modelandview modelandview (throws exception (/正在处理) (完成Controller方法后,在dispatcher servlet渲染视图之前) ) @ overridepublicvoidaftercompletion (httpservletrequestrequest,HttpServletResponse response,Object handler,Exception ex )

1 @ override2publicbooleanprehandle (httpservletrequestrequest,HttpServletResponse response, 在处理objecthandler(throwsexception3)4//controller方法之前执行拦截,如果返回了false则中断执行,反之亦然5 )6//判断当前的User是否为空,否则为7if 10 ) 11//拦截并返回登录界面12 response.sendredirect (request.getcontextpath ) ()/user/doLogin.do ) ); 13返回假; 14 )然后,必须在SpringMVC配置文件中设置拦截器。

1! -构成拦截器---2MVC :拦截器3 MVC :拦截器4! -阻止所有mvc控制器----5 MVC :映射路径='/* * '/6! -发布机制指定不阻止某个页面-- 7! -拦截器只对action起作用,所以填写方法而不是页面路径----8 MVC : exclude-mapping path='/user/dolog in.do '/9! -指定要使用的拦截器--- 10 bean class=' net.zjitc.interceptor.log in interceptor '/11/MVC : interceptor 12/MVC 3360 iiii

但是,不会阻止对其他页面的访问

你也想屏蔽页面吗? 需要过滤器!

2、滤网

同样需要过滤器类,用于实现javax.servlet.filter接口

请注意过滤器的路径没有错误。 因为有很多同名的接口

1 publicclassloginfilterimplementsfilter {2}3@ override4public void

init(FilterConfig filterConfig) throws ServletException 5 { 6 // 过滤器初始化 7 } 8 9 @Override10 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException11 {12 13 }14 15 @Override16 public void destroy()17 {18 // 过滤器销毁19 }20 }

稍微写一下方法:

1 @Override 2 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException 3 { 4 // ServletRequest是一个接口 而HttpServletRequest是接口的实现 5 // 但有些方法是HttpServletRequest独有的 例如getSession() 6 // HttpServletRequest接口继承自ServletRequest接口 增加了和Http相关的方法 7 // 但是我们可以强制转换 8 HttpServletRequest request=(HttpServletRequest)servletRequest; 9 HttpServletResponse response=(HttpServletResponse)servletResponse;10 11 // 若用户没有登录12 if (request.getSession().getAttribute("USERINFO")==null && request.getRequestURI().indexOf("/user/doLogin.do")==-1)13 {14 response.sendRedirect(request.getContextPath()+"/user/doLogin.do");15 }16 // 若用户已经登录 则继续下一个请求(继续访问)17 filterChain.doFilter(request,response);18 }

然后需去web.xml中配置过滤器:

1 <!-- 配置自定义的Filter 实现登录控制 --> 2 <filter> 3 <filter-name>sessionFilter</filter-name> 4 <filter-class>net.zjitc.filter.LoginFilter</filter-class> 5 </filter> 6 <filter-mapping> 7 <filter-name>sessionFilter</filter-name> 8 <!-- 拦截所有的页面 /斜杠代表在webapp目录下 --> 9 <url-pattern>/pages/*</url-pattern>10 <url-pattern>/css/*</url-pattern>11 <url-pattern>/img/*</url-pattern>12 <url-pattern>/failer.jsp</url-pattern>13 </filter-mapping>

三、总结
拦截器和过滤器其实都是AOP编程思想的实现
都可以体现例如权限的检查 日志的记录等功能
但是有不同之处:
1、使用范围不同
拦截器既可以用在web层 又可以用在Application和Swing程序中
而filter是Servlet规范规定的 只能用于web程序中
2、规范不同
拦截器是在Spring容器内的 是Spring框架支持的
而filter是Servlet规范规定的 是Servlet容器支持的

=============================================================================================================================================================

1、什么是Filter及其作用介绍
(1)概念
Servlet规范中三个技术 Servlet Listener Filter(顺序为L F S)
Filter是sun公司中servlet2.3后增加的一个新功能,在javaEE中定义了一个接口 javax.servlet.Filter来描述过滤器

(2)作用
通过Filter可以拦截访问web资源的请求与响应操作.
WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

(3)举例
在java web中,针对传入的request,或response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符。

2、Filter API介绍
Filter是javax.servlet包下的一个接口主要有以下三个方法

destory()
doFilter(ServletRequest request,ServletResponse response,FilterCjain chain)
init(FilterConfig filterConfig)
3、Filter链与Filter生命周期
(1)Filter链介绍
多个Filter对同一个资源进行了拦截,那么当我们在开始的Filter中执行chain.doFilter(request,response)时,是访问下一下Filter,直到最后一个Filter执行时,它后面没有了Filter,才会访问web资源。

(2)关于多个FIlter的访问顺序问题
如果有多个Filter形成了Filter链,那么它们的执行顺序是怎样确定的?
它们的执行顺序取决于在web.xml文件中配置的先后顺序。

(3)Filter生命周期
当服务器启动,会创建Filter对象,并调用init方法,只调用一次.
当访问资源,路径与Filter的拦截路径匹配,会执行Filter中的doFilter方法,
这个方法是真正拦截操作的方法.
当服务器关闭时,会调用Filter的destroy方法来进行销毁操作
过滤器是JavaEE标准,采用函数回调的方式进行。是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理。

二、拦截器
拦截器是spring容器的,是spring支持的

java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。

在面向切面编程AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作。

比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

三、过滤器和拦截器的区别
①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。拦截器可以获取ioc中的service bean实现业务逻辑。

(功课)回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

(功课)Spring MVC中每个控制器中可以定义多个请求处理方法,我们把这种请求处理方法简称为Action

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。