zoukankan      html  css  js  c++  java
  • Struts2的拦截器

    Struts2的拦截器
    当核心控制器拦截到用户请求后,大量拦截器将会对用户请求进行处理,然后才会调用用户开发的Action实例的方法来处理请求。
    eg:servlet-config拦截器直接将请求中的HttpServletRequest实例和HttpServletResponose实例传给Action

          params:这是最基本的一个拦截器,它负责解析Http请求中的参数,并将参数值设置成Action对应的属性值。
    (尽量避免在Action中直接访问Servlet API,这样会导致Action与Servlet的高耦合)
    一、理解拦截器:

    Interceptor的接口定义没有什么特别的地方,除了init和destory方法以外,intercept方法是实现整个拦截器机制的核心方法。


    1.Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.
    2. 拦截器栈(Interceptor Stack)。Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截
    器链中的拦截器就会按其之前定义的顺序被调用。

    1、定义拦截器(拦截器栈由多个拦截器组成)
    <interceptor name="Name1" class="asdasd">
    </interceptor>
    2、在<action name="login class="...">中使用<interceptor-ref name="Name1">元素引用拦截器

    struts-default.xml文件中配置了默认的拦截器
    <default-interceptor-ref name="defaultStack">

    拦截器的实现原理:

          大部分时候,拦截器方法都是通过代理的方式来调用的。

      Struts 2的拦截器实现相对简单。当请求到达Struts 2的StrutsPrepareAndExecuteFilter时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。

      事实上,我们之所以能够如此灵活地使用拦截器,完全归功于“动态代理”的使用。动态代理是代理对象根据客户的需求做出不同的处理。对于客户来说,只要知道一个代理对象就行了。那Struts2中,拦截器是如何通过动态代理被调用的呢当Action请求到来的时候,会由系统的代理生成一个Action的代理对象。系统对于拦截器的调用,是通过ActionInvocation来实现的。

                          intercept方法是实现整个拦截器机制的核心方法。

    1. 如果拦截器堆栈中还有其他的Interceptor,那么invocation.invoke()将调用堆栈中下一个Interceptor的执行。
    2. 如果拦截器堆栈中只有Action了,那么invocation.invoke()将调用Action执行。

    系统生成的代理对象会查找与该Action对应的拦截器,若有interceptor1则执行它的方法,直到遇到invocation.invoke()这句代码,继续调用interceptor2...如此递归调用直到拦截器栈中没有拦截器了,再调用Action执行,然后一直递归返回。

    所以我们可以以invocation.invoke()为界,将拦截器中的代码分成2个部分,在invocation.invoke()之前的代码,将会在Action之前被依次执行,而在invocation.invoke()之后的代码,将会在Action之后被逆序执行。由此,我们就可以通过invocation.invoke()作为Action代码真正的拦截点,从而实现AOP。

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

    拦截器和过滤器之间有很多相同之处,但是两者之间存在根本的差别。其主要区别为以下几点:
    1)拦截器是基于JAVA反射机制的,而过滤器是基于函数回调的。
    2)过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器
    3)拦截器只能对Action请求起作用,而过滤器可以对几乎所有的请求起作用。
    4)拦截器可以访问Action上下文、值栈里的对象,而过滤器不能
    5)在Action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

  • 相关阅读:
    App测试从入门到精通之安装、卸载和运行测试
    App测试从入门到精通之App分类和场景操作系统
    一步到位带你入门Selenium
    MAMP和WAMP搭建Web环境,数据库,数据分布可视化
    爬虫 Http请求,urllib2获取数据,第三方库requests获取数据,BeautifulSoup处理数据,使用Chrome浏览器开发者工具显示检查网页源代码,json模块的dumps,loads,dump,load方法介绍
    Python 基本语法,文件读写,数据结构和类型
    python 数据工程 and 开发工具Sublime
    jieba user guide
    python各类项目模块记录
    python parse xml using DOM
  • 原文地址:https://www.cnblogs.com/gaoxiangde/p/4359142.html
Copyright © 2011-2022 走看看