Struts2拦截器是基于AOP思想实现的,而AOP的实现是基于动态代理。Struts2拦截器会在访问某个Action之前或者之后进行拦截,并且Struts2拦截器是可插拔的;Struts2拦截器栈就是将拦截器按照顺序连接在一起的链,当满足拦截的要求时,则会按照实现声明的顺序依次执行拦截器。

1、Struts2自定义拦截器介绍

Struts2所有拦截器都必须实现Interceptor接口,Interceptor接口主要有3个方法:

  • init():初始化方法,只在拦截器加载时执行一次
  • intercept(ActionInvocation invocation):拦截器执行方法,每一次请求就执行一次
  • destory():销毁方法,只在拦截器释放时执行一次

AbstractInterceptor抽象类实现了Interceptor 接口。并为init()和destroy()提供了一个空白的实现,所以在实际开发中,自定义拦截器只需要继承AbstractInterceptor类, 并且实现intercept(ActionInvocation invocation)方法就可以了。

2、Struts2自定义拦截器创建步骤

1).创建一个类实现Interceptor接口或继承AbstractInterceptor类。
  2).重写intercept方法,这个方法是真正拦截操作,如果想要继续向下访问其它拦截器,必须在intercept方法中通过参数ActionInvocation调用invoke方法。
  3).配置拦截器,需要在struts.xml文件中配置,分为两种情况:

  • 为package包下所有<action>配置共用拦截器,需要通过设置<default-interceptor-ref>来设置默认拦截器,需要在<action>之前配置
    • 不配置拦截器栈,只会执行<default-interceptor-ref>设置的拦截器

       <package name="default" namespace="/" extends="struts-default">
      <interceptors>
      <interceptor name="login" class="com.sunny.interceptor.LoginIntercept"></interceptor>
      </interceptors>
      <default-interceptor-ref name="login"></default-interceptor-ref>
      <action name="loginAction" class="com.sunny.action.LoginAction">
      <result>/success.jsp</result>
      <result name="error">/error.jsp</result>
      </action>
      </package>
    • 配置拦截器栈
        <package name="default" namespace="/" extends="struts-default">
      <interceptors>
      <interceptor name="login" class="com.sunny.interceptor.LoginIntercept"></interceptor>
      <interceptor-stack name="my">
      <interceptor-ref name="login"></interceptor-ref>
      <interceptor-ref name="defaultStack"></interceptor-ref>
      </interceptor-stack>
      </interceptors>
      <default-interceptor-ref name="my"></default-interceptor-ref>
      <action name="loginAction" class="com.sunny.action.LoginAction">
      <result>/success.jsp</result>
      <result name="error">/error.jsp</result>
      </action>
      </package>
  • 为package包下某个<action>配置拦截器,需要在<action>中通过设置<interceptor-ref>来设置拦截器,如果想要执行defaultStack,则需要在<action>中配置
    • 不配置拦截器栈

       <package name="default" namespace="/" extends="struts-default">
      <interceptors>
      <interceptor name="login" class="com.sunny.interceptor.LoginIntercept"></interceptor>
      </interceptors>
      <action name="loginAction" class="com.sunny.action.LoginAction">
      <result>/success.jsp</result>
      <result name="error">/error.jsp</result>
      <interceptor-ref name="login"></interceptor-ref>
      <interceptor-ref name="defaultStack"></interceptor-ref>
      </action>
      </package>
    • 配置拦截器栈
       <package name="default" namespace="/" extends="struts-default">
      <interceptors>
      <interceptor name="login" class="com.sunny.interceptor.LoginIntercept"></interceptor>
      <interceptor-stack name="my">
      <interceptor-ref name="login"></interceptor-ref>
      <interceptor-ref name="defaultStack"></interceptor-ref>
      </interceptor-stack>
      </interceptors>
      <action name="loginAction" class="com.sunny.action.LoginAction">
      <result>/success.jsp</result>
      <result name="error">/error.jsp</result>
      <interceptor-ref name="my"></interceptor-ref>
      </action>
      </package>

2、Struts2自定义拦截器实现示例:判断是否登录

该示例主要是用来验证用户是否登录,如果没登录,就跳转到error.jsp页面,提示需要登录系统。

拦截器类:

 public class LoginIntercept extends AbstractInterceptor {

     @Override
public String intercept(ActionInvocation invocation) throws Exception {
Map session = ServletActionContext.getContext().getSession();
if (session.get("user")==null) {
return "error";
} else {
return invocation.invoke();
}
}
}

Action类:

 public class LoginAction extends ActionSupport {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String execute() throws Exception {
return "success";
}
}

struts.xml配置文件:

 <struts>
<constant name="struts.devMode" value="true" /> <package name="default" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="login" class="com.sunny.interceptor.LoginIntercept"></interceptor>
<interceptor-stack name="my">
<interceptor-ref name="login"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="loginAction" class="com.sunny.action.LoginAction">
<result>/success.jsp</result>
<result name="error">/error.jsp</result>
<interceptor-ref name="my"></interceptor-ref>
</action>
</package>
</struts>

input.jsp页面:

 <body>
<form action="${pageContext.servletContext.contextPath}/loginAction.action">
姓名:<input type="text" name="name"><br>
<input type="submit" value="提交">
</form>
</body>

error.jsp页面:

 <body>
请登录系统
</body>

登录界面:

由于没有登录系统,所以点击提交之后,会显示:

Struts2学习笔记(十)——自定义拦截器的更多相关文章

  1. SpringBoot学习笔记:自定义拦截器

    SpringBoot学习笔记:自定义拦截器 快速开始 拦截器类似于过滤器,但是拦截器提供更精细的的控制能力,它可以在一个请求过程中的两个节点进行拦截: 在请求发送到Controller之前 在响应发送 ...

  2. [原创]java WEB学习笔记74:Struts2 学习之路--自定义拦截器,struts内建的拦截器

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. 【Struts2学习笔记-6--】Struts2之拦截器

    简单拦截器的使用 拦截器最基本的使用: 拦截方法的拦截器 拦截器的执行顺序 拦截结果的监听器-相当于 后拦截器 执行顺序: 覆盖拦截器栈里特定拦截器的参数 使用拦截器完成-权限控制 主要完成两个功能: ...

  4. Struts2学习笔记04 之 拦截器

    一.创建拦截器组件 1. 创建一个类,实现Interceptor接口,并实现intercept方法 2.注册拦截器 3.引用拦截器 二.拦截器栈 预置拦截器: 默认引用拦截器 拦截器调用顺序: Fil ...

  5. [ SSH框架 ] Struts2框架学习之四(自定义拦截器)

    一.Struts2的拦截器 1.1 拦截器概述 拦截器,在AOP( Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.拦截 ...

  6. struts2框架学习笔记6:拦截器

    拦截器是Struts2实现功能的核心部分 拦截器的创建: 第一种: package interceptor; import com.opensymphony.xwork2.ActionInvocati ...

  7. Struts2学习:interceptor(拦截器)的使用

    对于需要登陆验证.权限验证等功能的网站,每一次请求,每一个action都写一段验证的代码,未免显得冗余且不易维护.struts2提供了拦截器interceptor,为这些页面提供一个切面,或者说公共组 ...

  8. Struts2学习第四天——拦截器及文件上传

    1.概述 Struts2的很多核心功能都是由拦截器完成的. 拦截器很好的实现了AOP的编程思想,在动作的执行之前和结果的返回之后,做拦截处理. 2.struts2的默认拦截器栈 3.自定义拦截器 St ...

  9. Struts2学习第4天--拦截器

    第1章     Struts2_day04笔记 1.1      上次课内容回顾 l  OGNL表达式 n  OGNL的概述 u  OGNL:对象图导航语言,是一门功能强大的表达式语言. n  OGN ...

随机推荐

  1. shiro整合oauth

    一.基本思路脑图 二.客户端shiro配置 shiro配置文件 <?xml version="1.0" encoding="UTF-8"?> < ...

  2. UltraEdit MAC破解方法

    在终端输入 printf '\x31\xC0\xFF\xC0\xC3\x90' | dd seek=$((0x92D370)) conv=notrunc bs=1 of=/Applications/U ...

  3. request.setcharacterencoding()和request.setcontenttype(“html/css;charset”)的格式区别

    1.request.setCharacterEncoding()是设置从request中取得的值或从数据库中取出的值 指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默 ...

  4. 浅谈游戏中BOSS设计的思路

    对于大多数游戏来说,BOSS在其设计上都有着不可替代的作用,也是玩家印象最为深刻的一部分.近期自己也有在做BOSS的设计工作,有一些心得想要分享一下: 1.明确BOSS的设计目的 在设计之初,我们一定 ...

  5. CentOS7.3虚拟机双网卡配置

    笔者在学习和工作中经常要用到linux,专门装一个linux主机固然可以,但是毕竟还要用到windows,解决的办法就是用vmware来搭建linux虚拟机.关于linux虚拟机上网的问题,笔者写过很 ...

  6. 个人作业2--英语学习APP案例分析

    1.下载APP并使用,上手体验 个人很喜欢这种风格,画面简洁,排版精细,尤其是联想词的界面,很惊喜.但是很多链接比如精选文章点进去之后的UI设计并不理想,感觉只是一个网页而已.并且我不能够保存或者收藏 ...

  7. 数位dp模板 [dp][数位dp]

    现在才想到要学数位dp,我是不是很弱 答案是肯定的 以一道自己瞎掰的题为模板 //题: //输入数字n //从0枚举到n,计算这n+1个数中含有两位数a的数的个数 //如12930含有两位数93 #i ...

  8. 基于jmeter,jenkins,ANT接口,性能测试框架

    背景 公司计划推接口和性能测试,搭建这个性能测试框架框架是希望能够让每个人(开发人员.测试人员)都能快速的进行性能,接口测试,而不需要关注性能测试环境搭建过程.因为,往往配置一个性能环境可能需要很长的 ...

  9. tensorflow bias_add应用

    import tensorflow as tf a=tf.constant([[1,1],[2,2],[3,3]],dtype=tf.float32) b=tf.constant([1,-1],dty ...

  10. 机器学习 —— 基础整理(三)生成式模型的非参数方法: Parzen窗估计、k近邻估计;k近邻分类器

    本文简述了以下内容: (一)生成式模型的非参数方法 (二)Parzen窗估计 (三)k近邻估计 (四)k近邻分类器(k-nearest neighbor,kNN) (一)非参数方法(Non-param ...