您的位置:首页 > 编程语言 > Java开发

struts2拦截器小结

2017-10-29 13:47 197 查看
拦截器是struts2中的概念

什么是拦截器?

1、Struts2里面封装的功能都在拦截器里面

2、struts2里面封装了很多功能,有很多拦截器,但这些拦截器每次并不是全部执行,而是执行其中的默认拦截器

3、默认拦截器所在的位置:

 

      

拦截器在什么时候执行?

在action对象创建之后和action的方法执行之前执行(打上断点自己运行)

拦截器底层原理

拦截器底层主要使用两个原理:Aop思想和责任链模式

Aop思想:

面向切面编程,例如:有基本的登陆功能,想要扩展功能,按照aop思想是不通过修改源代码的方式扩展原有的功能,而不是修改源代码(这是比较表面的理解)

使用aop思想给登陆功能添加权限判断功能

责任链模式:

责任链模式是一种设计模式

责任链模式:

例如要执行多个操作,只有前一个操作执行完并且放行放行后,才能进行下一个操作

 

责任链模式和过滤链很相似

过滤链:

一个请求有可能被多个过滤器过滤,只有过滤器进行放行的动作时,请求才会继续执行

 

 

Aop思想和责任链模式是如何用到拦截器里面的?

1、 拦截器是在aciton创建之后,方法执行之前执行,在执行方法之前执行拦截器,执行过程使用aop思想,在action中并没有直接调用拦截器的方法,而是使用配置文件方式进行操作

2、 在执行拦截器的时候,执行了很多拦截器,这个过程使用责任链模式

 

过滤器和拦截器的区别?

过滤器理论上可以过滤任意内容,如:html、jsp、servlet、图片路径

拦截器只可以拦截action

 

Servlet和action的区别?

Servlet默认第一次访问的时候创建,创建一次,单实例对象

Action在每次访问的时候创建,创建多次,多个实例对象

 

拦截器的结构?

拦截器继承自AbstractiInterceptor,然后这个抽象类实现Interceptor接口

接口中有三个方法:初始化操作、销毁操作、拦截逻辑操作

自定义拦截器

可以使用上面这种方法实现拦截器,实际开发中通常继承MethodFilterInterceptor,可以让action里面的某个方法不进行拦截,那么如何让拦截器和action产生关系呢?并不是在action中调用拦截器的方法,而是通过配置文件的方式建立关系

例子

自定义登陆拦截器

第一步:实现基本的登陆功能

第二步:创建类继承自MethodFilterInterceptor类,重写类中的doIntercpter方法

第三步:配置action和拦截器的关系(注册拦截器)

              如何配置呢?

1、 在需要拦截的action所在package标签中声明拦截器

2、 在action标签中使用自定义拦截器

3、 Struts2里面执行了很多的默认拦截器,如果在action里面配置自定义拦截器,那么默认的拦截器就不会执行,这是不允许的,因此需要把默认拦截器手动配置一下

第四步:通过以上三步,则拦截器配置完成,但是呢,他会对action所有的方法拦截,因此还需要配置不需要拦截的方法。如何解决呢?在使用拦截器的标签中配置不需要拦截的方法

 

具体代码:

拦截器中:

packagecom.czp.loginintercepter.intercepter;

 

importorg.apache.struts2.ServletActionContext;

 

import com.opensymphony.xwork2.ActionInvocation;

importcom.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

 

public class LoginIntercepter extendsMethodFilterInterceptor {

 

       @Override

       protectedString doIntercept(ActionInvocation invocation) throws Exception {

              Stringusername =ServletActionContext.getRequest().getSession().getAttribute("username").toString();

              if(username!=null) {

                     //去action中调用原本需要调用的方法,拦截器放行了

                     invocation.invoke();

              }

              return"login";

       }

 

}

Struts.xml文件中:

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEstruts
PUBLIC "-//ApacheSoftware Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
 
<packagename="user"namespace="/user"extends="struts-default">
    <!-- 声明拦截器 -->
    <interceptors>
       <interceptorname="userIntercepter"class="com.czp.loginintercepter.intercepter.LoginIntercepter"></interceptor>
    </interceptors>
    <actionname="user_*"class="com.czp.loginintercepter.action.UserAction"method="{1}">
       <!-- 引用拦截器 -->
       <interceptor-refname="userIntercepter">
           <!-- 声明不需要拦截的方法 -->
           <paramname="excludeMethods">login</param>
       </interceptor-ref>
      
       <!-- 引用默认的拦截器 -->
       <interceptor-refname="defaultStack"></interceptor-ref>
       <resultname="loginSuccess">/WEB-INF/user.jsp</result>
       <resultname="show">/WEB-INF/show.jsp</result>
      
    </action>
</package>
</struts>   
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: