Java拦截器和过滤器的区别有哪些

  介绍

小编给大家分享一Java拦下截器和过滤器的区别有哪些,希望大家阅读完这篇文章之后都有所收获、下面让我们一起去探讨吧!

<强>一、过滤器(过滤器)

过滤器处于客户端与网络资源(Servlet、JSP、HTML)之间,客户端与网络资源之间的请求和响应都要通过过滤器进行过滤。举例:在过滤器中定义了禁止访问192.10.10.1这个地址,那么当客户端发出访问192.10.10.1的请求时,经过过滤器后,客户端得到的响应是出现该IP禁止访问的提示。在Java Web中,你传入的请求,响应提前过滤掉一些信息,或者提前设置一些参数,然后再传入Servlet或者struts的行动进行业务逻辑,比如过滤掉非法url(不是登录。做的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者struts的行动前统一设置字符集,或者去除掉一些非法字符

<强>二、拦截器(拦截器)

拦截器是一种面向方面/切面编程AOP(面向方面编程),而面向切面就是将多个模块的通用服务进行分离,如权限管理,日志服务,他们在多个模块中都会用的到,就可以将其各自封装为一个可重用模块。而这些通用服务的具体实现是通过拦截器来完成,比如用户客户端访问一些保密模块都应先通过权限审查的拦截器来进行权限审查,确定用户是否具有该项操作的权限后方能向下执行。在面向切面编程的就是在你的服务或者一个方法前调用一个方法,或者在方法后调用一个方法,比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

<强>三、拦截器与过滤器的区别

1,拦截器是基于java的反射机制的,而过滤器是基于函数回调(职责链)

2,过滤器依赖与servlet容器,而拦截器不依赖与servlet容器

3,拦截器只能对行动请求起作用,而过滤器则可以对几乎所有的请求起作用

4,拦截器可以访问行动上下文,值栈里的对象,而过滤器不能

5,在行动的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

<强>执行顺序:过滤前,拦截前,行动处理,拦截后,过滤后。个人认为过滤是一个横向的过程,首先把客户端提交的内容进行过滤(例如未登录用户不能访问内部页面的处理);过滤通过后,拦截器将检查用户提交数据的验证,做一些前期的数据处理,接着把处理后的数据发给对应的行动,行动处理完成返回后,拦截器还可以做其他过程(还没想到要做啥),再向上返回到过滤器的后续操作。

±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±

<强>四,详细说明

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

下面通过实例来看一下过滤器和拦截器的区别:
使用拦截器进行/admin目录下jsp页面的过滤

& lt; package  name=皀ewsDemo",延伸=皊truts-default",名称空间=?admin"比;   ,,,,,,,& lt; interceptors>   ,,,,,,,,,,,& lt; interceptor  name=癮uth",类=癱om.test.news.util.AccessInterceptor",/比;   ,,,,,,,,,,,& lt; interceptor-stack  name=癮uthStack"比;   ,,,,,,,,,,,,,,,& lt; interceptor-ref  name=癮uth",/比;   ,,,,,,,,,,,& lt;/interceptor-stack>   ,,,,,,,& lt;/interceptors>   ,,,,,,,& lt; !——, action ——比;   ,,,,,,,& lt; action  name=皀ewsAdminView ! *“,类=皀ewsAction",方法=皗1}”在   ,,,,,,,,,,,& lt; interceptor-ref  name=癲efaultStack"/比;   ,,,,,,,,,,,& lt; interceptor-ref  name=癮uthStack"比;   ,,,,,,,,,,,& lt;/interceptor-ref>

下面是我实现的拦截器类:

package  com.test.news.util;   import  java.util.Map;   import  com.opensymphony.xwork2.ActionContext;   import  com.opensymphony.xwork2.ActionInvocation;   import  com.opensymphony.xwork2.interceptor.AbstractInterceptor;   import  com.test.news.action.AdminLoginAction;/* *   *,@author  chaoyin   */public  class  AccessInterceptor  extends  AbstractInterceptor  {   ,,,private  static  final  long  serialVersionUID =, -4291195782860785705 l;   ,,,,   ,,@Override   ,,,public  String 拦截(ActionInvocation  actionInvocation), throws  Exception  {   ,,,,,,,,   ,,,,,,,,ActionContext  ActionContext =, actionInvocation.getInvocationContext ();   ,,,,,,,,Map  session =, actionContext.getSession ();   ,,,,,   ,,,,,,,//except  login 行动   ,,,,,,,,Object  action =, actionInvocation.getAction ();   ,,,,,,,if  (action  instanceof  AdminLoginAction), {   ,,,,,,,,,,,return  actionInvocation.invoke ();   ,,,,,,,,}   ,,,,,,//check 会话   ,,,,,,,如果(session.get (“user")==null ) {   ,,,,,,,,,,,return “logout";   ,,,,,,,,}   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

Java拦截器和过滤器的区别有哪些