JSP 开发之Struts2内建自定义拦截器

发布时间 - 2026-01-11 00:47:55    点击率:

JSP 开发之Struts2内建自定义拦截器

Struts2的自定义拦截器主要用于解析请求参数,将请求参数赋值给Action属性,执行数据校验,文件上传等等操作。当需要扩展Struts2的功能时,我们只需要提供相应的拦截器并将它配置到Struts2容器中即可;当我们不需要使用的时候,只需要取消它在Struts2容器中的配置就行了。

1>配置拦截器主要使用四个配置元素:

:用于配置自定义拦截器
:用于引用拦截器或者拦截器栈
:用于配置自定义拦截器栈,一个拦截器栈由多个拦截器构成,也可以包含其他的拦截器栈
:拥有配置参数

<!--配置自定义拦截器-->
<interceptor name="拦截器名" class="实现类">
  <param name>..</param>
  ...
</interceptor>

<!--配置拦截器栈,用于一次性过引用多个拦截器-->
<interceptor-stack name="拦截器栈名">
  <interceptor-ref name="拦截器1" />
  <interceptor-ref name="拦截器2">
    <param name>..</param>
    ...
  </interceptor-ref>
  <!--也可以引用拦截器栈-->
  <interceptor-ref name="拦截器栈名" />
</interceptor-stack>

2>配置好了拦截器之后,就可以在元素中使用该拦截器了,使用自定义拦截器时,还必须显示使用系统默认的拦截器defaultStack。

<package ..>
  <!--配置包下所有Action的默认拦截器--》
  <!--如果Action配置了自己的拦截器,那么默认拦截器将不会配置到该Action下-->
  <default-interceptor-ref name="defaultStack" />
  <action ...>
    <!--配置自己的interceptor拦截器-->
    <interceptor-ref name="myInterceptor" />
    <!--因为已经配置了自己的拦截器,所以包默认配置拦截器将不作用,因此需要自己显示配置defaultStack系统默认拦截器-->
    <interceptor-ref name="defaultStack" />
  </action>
</package>

3>用户自定义拦截器:Struts2提供了Interceptor拦截器原生接口:

public interface Interceptor extends Serializable
{
  //初始化拦截器的回调方法
  void init() ;
  //实现拦截的处理方法
  String intercept(ActionInvocation invocation) throws Exception ;
  //销毁拦截器之前的回调方法
  void destroy() ;
}

因此,用户自定义拦截器类需要实现该接口并提供该接口中的所有抽象方法的实现。不过Struts2还提供了该接口的一个直接实现类:AbstractInterceptor,该类提供了init()和destroy()方法的实现,我们只需要重写intercept()拦截方法即可:

public class simpleInterceptor extends AbstractInterceptor
{
  private String username ;
  private String password ;
  //omit setter and getter methods
  @Override
  public String intercept(ActionInvocation invocation) throws Exception 
  {
    //获取被拦截的Action实例
    LoginAction action = (LoginAction)invocation.getAction() ;
    System.out.println("开始拦截:" + new Date()) ;
    //取得开始执行Action处理方法的时间
    long start = System.currentTimeMillis() ;
    //回调执行Action被拦截的处理方法
    String result = invocation.invoke() ;
    System.out.println("结束执行:" + new Date()) ;
    //取得执行Action处理方法之后的时间
    Long end = System.currentTimeMillis() ;
    System.out.println("执行用时:" + (end-start) +"ms") ;
    return result ;
  }
}

上面提供的AbstractInterceptor类定义的拦截器会拦截Action内的所有处理方法,如果只想拦截指定的方法,或者想指定哪些方法拦截,哪些方法不拦截,可以使用Struts2提供的MethodFilterInterceptor类,该类是AbstractInterceptor类的子类,提供了下面三个主要的方法:

1>String doIntercept(ActionInvocation invocation) throws Exception:同intercept()方法作用一样
2>void setIncludeMethods(String includeMethods):设置需要被拦截的方法名
3>void setExcludeMethods(String excludeMethods):设置不需要被拦截的方法名

其中两个setter方法可以在配置该拦截器时通过param元素来指定属性值

<interceptor name="simpleIntercept2" class="com.chengxi.SimpleInterceptor2">
  <param name="includeMethods">login,execute</param>
  <param name="excludeMethods">regiset</param>
</interceptor>

4>拦截器的执行顺序:如果有多个拦截器同时作用于一个Action上时,遵循:在Action的控制方法执行之前,先定义的拦截器先作用执行;在Action的控制方法执行之后,先定义的拦截器后作用执行;也就是在invocation.invoke()方法这个点进行分界

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# JSP  # Struts2内建自定义拦截器  # struts2自定义拦截器的示例代码  # struts2如何使用拦截器进行用户权限控制实例  # Struts2之Action接收请求参数和拦截器详解  # Struts2拦截器登录验证实例  # Java的Struts2框架中拦截器使用的实例教程  # JavaWeb中Struts2拦截器深入分析(一)  # struts2过滤器和拦截器的区别分析  # Struts拦截器实现拦截未登陆用户实例解析  # 拦截器  # 自定义  # 自己的  # 多个  # 只需要  # 回调  # 不需要  # 是在  # 好了  # 也就  # 子类  # 其他的  # 希望能  # 只想  # 重写  # 可以使用  # 当我们  # 将它  # 它在  # 谢谢大家 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  如何利用DOS批处理实现定时关机操作详解  文字头像制作网站推荐软件,醒图能自动配文字吗?  Laravel如何使用Gate和Policy进行授权?(权限控制)  如何快速生成凡客建站的专业级图册?  Python进程池调度策略_任务分发说明【指导】  JavaScript如何操作视频_媒体API怎么控制播放  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  网站制作大概多少钱一个,做一个平台网站大概多少钱?  如何快速辨别茅台真假?关键步骤解析  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  如何挑选最适合建站的高性能VPS主机?  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  Laravel怎么在Blade中安全地输出原始HTML内容  如何在服务器上三步完成建站并提升流量?  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  打造顶配客厅影院,这份100寸电视推荐名单请查收  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  js实现获取鼠标当前的位置  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  ,怎么在广州志愿者网站注册?  如何在万网自助建站平台快速创建网站?  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  Laravel PHP版本要求一览_Laravel各版本环境要求对照  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  Linux系统命令中tree命令详解  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  JavaScript如何实现错误处理_try...catch如何捕获异常?  大同网页,大同瑞慈医院官网?  如何彻底删除建站之星生成的Banner?  Laravel集合Collection怎么用_Laravel集合常用函数详解  如何在建站宝盒中设置产品搜索功能?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  如何为不同团队 ID 动态生成多个非值班状态按钮  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  制作电商网页,电商供应链怎么做?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  如何在七牛云存储上搭建网站并设置自定义域名?