java中的Struts2拦截器详解

所属分类: 软件编程 / java 阅读数: 39
收藏 0 赞 0 分享

最近在学习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>

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

更多精彩内容其他人还在看

Java concurrency之锁_动力节点Java学院整理

这篇文章主要为大家详细介绍了Java concurrency之锁的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java8新特性之StampedLock_动力节点Java学院整理

本文从synchronized、Lock到Java8新增的StampedLock进行对比分析,对Java8新特性之StampedLock相关知识感兴趣的朋友一起看看吧
收藏 0 赞 0 分享

Java8新特性之lambda的作用_动力节点Java学院整理

我们期待了很久lambda为java带来闭包的概念,但是如果我们不在集合中使用它的话,就损失了很大价值。现有接口迁移成为lambda风格的问题已经通过default methods解决了,在这篇文章将深入解析Java集合里面的批量数据操作解开lambda最强作用的神秘面纱。
收藏 0 赞 0 分享

Java8新特性之Base64详解_动力节点Java学院整理

这篇文章主要为大家详细介绍了Java8新特性之Base64的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java8新特性之JavaFX 8_动力节点Java学院整理

这篇文章主要介绍了Java8新特性之JavaFX 8的相关知识,非常不错,具有参考借鉴价值,需要的朋友参考下吧
收藏 0 赞 0 分享

将本地jar包安装进入maven仓库(实现方法)

下面小编就为大家带来一篇将本地jar包安装进入maven仓库(实现方法)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

浅谈Java finally语句到底是在return之前还是之后执行(必看篇)

下面小编就为大家带来一篇浅谈Java finally语句到底是在return之前还是之后执行(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

基于Java并发容器ConcurrentHashMap#put方法解析

下面小编就为大家带来一篇基于Java并发容器ConcurrentHashMap#put方法解析。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

详解Spring Boot Profiles 配置和使用

本篇文章主要介绍了详解Spring Boot Profiles 配置和使用,具有一定的参考价值,有兴趣的可以了解一下
收藏 0 赞 0 分享

详解Spring Boot 属性配置和使用

本篇文章主要介绍了详解Spring Boot 属性配置和使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享
查看更多