过滤器和拦截器

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

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


过滤器:

        过滤器是Struts2的第一层控制器,请求对象首先被过滤器过滤。Struts2的过滤器有三个层次

过滤器和拦截器_第1张图片

说明:

  1. ActionContextCleanUp,可选的过滤器,主要为了继承SiteMesh等插件
  2. OtherFilters,如果应用中使用到了SiteMesh这样的插件,就需要配置插件的相关信息
  3. FilterDispatcher:该过滤器是Struts2应用中必须配置的过滤器,其对应的类是org.apache.struts2.dispatcher.FilterDispatcher。功能:执行Action,清空ActionContext对象。服务静态内容。必须在web.xml中作相应配置。

具体流程:

 

        1、服务器端提交请求,容器初始化HttpServletRequest请求对象;


        2、请求的对象被一系列的Servlet过滤器过滤,其中FilterDispatcher过滤器是Struts2 API中提供的,这个必须使用;


       3、 调用FilterDispatcher,FilterDispatcher调用ActionMapper,决定请求是否需要调用某个Action,如果需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy(Action代理);


        4、ActionProxy通过Configuration Manager解析框架的配置文件,找到需要调用的Action,ActionProxy创建一个ActionInvocation的实例;


        5、ActionInvocation实例使用命令模式回调Action中的execute方法,Action调用业务逻辑类完成业务逻辑。


        6、Action执行完毕,ActionInvocation根据struts.xml中的配置找到对应的返回结果(被称为Result)。返回结果通常是Jsp


       7、 在调用Action前后,将调用该Action涉及到的相关拦截器(Interceptor)

 

拦截器:

        拦截器(Interceptor)是Struts2中第二个层次的控制器,在Action执行的前后运行一些Action类需要的通用功能。

 使用:

        1、使用拦截器前,必须先在struts.xml中定义拦截器,拦截器在下使用定义

 

例如:





名词扩展:

        拦截器栈(Interceptor Stack)类似于过滤器链。拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器栈的拦截器就会按其之前定义的顺序被调用。这就像设计模式中的职责链,直到遇到一个满足条件的进行处理。


        2、定义了拦截器或拦截器栈后,可以在Action中使用,通过指定要使用的拦截器或拦截器栈。



       3、API中的拦截器都在struts-default.xml的struts-default包中定义



       


 

      

        struts.xml中的Action都继承了struts-default.xml中的struts-default包,因此都默认使用struts-default包的默认拦截器栈,大多数情况下,需要保证任何Action都被struts-default包的默认拦截器引用拦截。

如果要自定义拦截器,首先必须定义拦截器,然后再Action中引用定义好的拦截器。

自定义拦截器注意:

        1、自定义拦截器类需要实现Interceptor接口

        2、主要覆盖接口中的intercept(ActionInvocation arg0)方法

        3、intercept方法的参数ActionInvocation非常重要,其中的invoke可以调用下一个拦截器或者Action


Action:

        1、Action是Struts2的第三个层次的控制器,需要程序员自行开发

        2、Action是Struts2应用中使用数量最多的控制器

        3、Action实现的功能与Servlet非常类似,然而,Action不是Servlet,仅仅是一个普通的Java类。

 

小结:

        拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

执行顺序:过滤 - 拦截 - Action处理


你可能感兴趣的:(【Java】,————【SSH】,struts,拦截器,过滤器)