当前位置: 移动技术网 > IT编程>开发语言>Java > java中的Struts2拦截器详解

java中的Struts2拦截器详解

2019年07月22日  | 移动技术网IT编程  | 我要评论
最近在学习struts的拦截器,现在来总结一下。 1、拦截器是什么? 拦截器相当于过滤器:就是将不想要的去掉,想要的留下。拦截器抽象出一部分代码可以用来完善原来的act

最近在学习struts的拦截器,现在来总结一下。

1、拦截器是什么?

拦截器相当于过滤器:就是将不想要的去掉,想要的留下。拦截器抽象出一部分代码可以用来完善原来的action。同时可以减轻代码冗余,提高重用率。通俗地讲就是一张网,过滤掉不需要的沙子,留下水。

2、拦截器的作用:

拦截器可以构成特定的功能。比如权限认证、日志记录和登陆判断。

3、拦截器的原理

  

其每一个action请求都在拦截器中,每一个action可以将操作转交给下面的拦截器,也可以直接退出到界面上。

4、定义拦截器:

(1)自定义一个实现interceptor接口(不过我初学者一般直接实现框架中的interceptor)

(2)在struts.xml中注册定义的拦截器

(3)可以需要的action中引用拦截器

interceptor接口声明了三个方法

public interface interceptor extends serializable {
 
  void destroy();
 
  void init();
 
  string intercept(actioninvocation invocation) throws exception;
}

init方法是在action作用之前调用,就是开始给烂机器的初始化操作。

destory方法在拦截器被垃圾回收之前调用,用来回收init方法初始化的资源。

interceptor方法是拦截器的主要操作。如果需要调用后续的action或者拦截器,只需要在该方法中调用invocation.invoke()方法即可,在该方法调用的前后可以插入action调用前后拦截器需要做的方法。

现在对用户登录进行拦截,代码如下:

public string intercept(actioninvocation invocation) throws exception {
    
    system.out.println("在action执行之前");
    actioncontext actioncontext=invocation.getinvocationcontext();
    map<string,object> session=actioncontext.getsession();
    
    object currentuser=session.get("currentuser");
    string result=null;
    if(currentuser!=null){
      result=invocation.invoke();
      
    }else{
      
      httpservletrequest request=(httpservletrequest)invocation.getinvocationcontext().get(servletactioncontext.http_request);
      request.setattribute("error", "请先登录");
      result="error";
    }
    system.out.println("result+"+result);
    system.out.println("在action执行之后");
    return result;
  }

注册拦截器:

<interceptors>
       <interceptor name="myinterceptor"
       class="com.fangchao.interceptor.myinterceptor"></interceptor>
       <interceptor name="logininterceptor"
       class="com.fangchao.interceptor.logininterceptor"></interceptor>
       
       <interceptor-stack name="mystack">
         <interceptor-ref name="logininterceptor"></interceptor-ref>
         <interceptor-ref name="defaultstack"></interceptor-ref>  
       </interceptor-stack>
     </interceptors>

上述代码中的interceptor-stack是个拦截器栈。到目前为止,就是在下面引用时,比较方便。一般来讲,每个action都会使用defaultstack。

拦截器参数:

配置参数:

  • excludemethods:过滤掉不使用拦截器的方法
  • includemethods:使用拦截器的方法。

有两种配置方式:

<interceptor-ref name="validation">
 <param name="excludemethods">myvalidationexcudemethod</param>
</interceptor-ref>
<interceptor-ref name="workflow">
 <param name="excludemethods">myworkflowexcludemethod</param>
</interceptor-ref>

或者

<interceptor-ref name="defaultstack">
  <param name="validation.excludemethods">myvalidationexcludemethod</param>
  <param name="workflow.excludemethods">myworkflowexcludemethod</param>
</interceptor-ref>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网