Struts2之类范围拦截器和方法拦截器
1、Struts2拦截器的体系结构
Struts2拦截器最大的特点是其透明性,即用户感觉不到它的存在,但我们在使用Struts2框架时,拦截器时时刻刻都在帮助我们处理很多事情。
包括:
文件上传
表单校验
自动将预定义好的表单参数值封装给Action使用等
说明:
每一个Action请求都包装在一系列的拦截器内部。拦截器可以动态拦截Action。拦截器所提供的机制可以保证在执行一个Action的前后执行拦截器中的代码,也可以在一个Action执行前阻止其执行。
2、Struts2内建拦截器
Struts2内建了大量的拦截器,这些拦截器以name-class形式配置在struts-default.xml中。
name是拦截器的名称,即以后使用该拦截器的唯一标识
class则指定了该拦截器的实现类
如果我们定义的package继承了Struts2的默认struts-default包,则可以自行使用下面定义的拦截器。
<package name="hello" namespace="/" extends="struts-default">
<action name="HelloWorld" class="com.pxy.struts2.action.HelloWorld">
<result name="success">/HelloWorld.jsp</result>
</action>
</package>
常见的struts2内建拦截器介绍见下表

在处理与系统逻辑相关的通用功能时,需要通过自定义拦截器来实现。
如权限控制,日志记录
一、自定义基于类范围的拦截器
创建自定义拦截器步骤如下:
1、创建类SimpleAction,继承于ActionSupport,定义operator方法,用于获取当前系统时间
public class SimpleAction extends ActionSupport{
public String operator(){
System.out.println("开始执行SimpleAction类的operator()时间为:"+DateTimeUtils.getStringDate(new Date()));
return "operator";
}
}
2、创建拦截器类SimpleInterceptor,继承于AbstracInterceptor,该类用于对SimpleAction类进行拦截
public class SimpleInterceptor extends AbstractInterceptor{
public String intercept(ActionInvocation invocation) throws Exception {
//打印出在执行SimpleAction类之前执行拦截器的时间
System.out.println("在执行SimpleAction之前开始执行SimpleInterceptor的intercept()的时间为:"+DateTimeUtils.getStringDate(new Date()));
//调用下一个拦截器,如果没有拦截器就调用匹配的Action
String result=invocation.invoke(); //该result是方法的返回值 本例中result=operator
//打印出在执行SimpleAction类之后执行拦截器的时间
System.out.println("在执行SimpleAction之后开始执行SimpleInterceptor的intercept()的时间为:"+DateTimeUtils.getStringDate(new Date()));
return result;
}
}
3、在struts.xml文件中,配置SimpleAction和SimpleIntercept的相关信息
<interceptors>
<!-- 自定义拦截器 -->
<interceptor name="simple"class="包名.SimpleInterceptor"/>
</interceptors>
<!-- 需要拦截的Action -->
<action name="simple_*" class="包名.SimpleAction" method="{1}">
<result name="{1}">/success.jsp</result>
<interceptor-ref name="simple"/> <!-- 将拦截器别名为Simple的拦截器注给SimpleAction -->
<interceptor-ref name="defaultStack"/> <!-- 配置默认拦截器 -->
</action>
注意:如果为Action指定一个拦截器,则系统默认的拦截器就会失效,导致Struts2的很多功能无法使用。所以Action在指定了一个拦截器后,还需要将默认的拦截器注册给Action。Struts2默认拦截器的别名为defaultStack。
4、浏览器输入:http://localhost:8080/项目名/simple_operator.action
二、方法拦截器
在上面的类拦截器中,我们可以在SimpleAction再定义一个方法query()方法,然后访问:http://localhost:8080/项目名/simple_query.action,即可对query方法拦截。
更细粒度的控制方法拦截,则需要进行如下的配置:
<interceptors>
<interceptor name="simple" class="包名.SimpleInterceptor" />
</interceptors>
<action name="simple_*" class="包名.SimpleAction" method="{1}">
<interceptor-ref name="simple">
<!--includeMethods参数用于指明哪些方法需要拦截
如果拦截多个方法,则每个方法之间通过逗号“,”分隔
-->
<param name="includeMethods">query</param>
</interceptor-ref>
<interceptor-ref name="defaultStack" />
</action>
并且拦截器类要继承MethodFilterInterceptor类,而不是继承AbstractInterceptor类,否则每个访问到的方法都会被自动拦截,达不到控制的目的。
public class SimpleInterceptor extends MethodFilterInterceptor{
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
System.out.println("进入拦截器");
//调用下一个拦截器
String result = invocation.invoke();
System.out.println("调用完拦截器"+"--result的值:"+result);
return result;
}
}
常见的登录拦截操作如下:
@Override
public String intercept(ActionInvocation invocation) throws Exception {
HttpSession session = ServletActionContext.getRequest().getSession();
Object account = session.getAttribute("account");
if(account != null){
return invocation.invoke();
}
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("err", "请登录后操作!");
return "login";
}
Struts2之类范围拦截器和方法拦截器的更多相关文章
- django 把函数装饰器变为方法装饰器
暗暗啊
- typescript装饰器 方法装饰器 方法参数装饰器 装饰器的执行顺序
/* 装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为. 通俗的讲装饰器就是一个方法,可以注入到类.方法.属性参数上来扩展类.属性.方法.参数的功能. 常 ...
- typescript装饰器定义 类装饰器 属性装饰器 装饰器工厂
/* 装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为. 通俗的讲装饰器就是一个方法,可以注入到类.方法.属性参数上来扩展类.属性.方法.参数的功能. 常 ...
- struts2 参数注入 方法拦截器
web.xml: <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi=" ...
- [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- 从struts2拦截器到自定义拦截器
拦截器可谓struts2的核心了,最基本的bean的注入就是通过默认的拦截器实现的,一般在struts2.xml的配置中,package内直接或间接继承了struts-default.xml,这样st ...
- Struts2自定义拦截器Interceptor以及拦截器登录实例
1.在Struts2自定义拦截器有三种方式: -->实现Interceptor接口 public class QLInterceptorAction implements Interceptor ...
- Struts2之Action接收请求参数和拦截器
技术分析之在Struts2框架中使用Servlet的API 1. 在Action类中也可以获取到Servlet一些常用的API * 需求:提供JSP的表单页面的数据,在Ac ...
- JAVAEE——struts2_04:自定义拦截器、struts2标签、登陆功能和校验登陆拦截器的实现
一.自定义拦截器 1.架构 2.拦截器创建 //拦截器:第一种创建方式 //拦截器生命周期:随项目的启动而创建,随项目关闭而销毁 public class MyInterceptor implemen ...
随机推荐
- Linux kernel rbtree
Linux kernel rbtree 因编写内核模块时需要用到rbtree来记录异步request,研究分析了一下kernel rbtree的使用方法,记录于此.本文主要参考了内核文档rbtree. ...
- 再次梳理css3动画部分知识
1.transform: 适用于2D或3D转换的元素 transform-origin:元素的位置点 css3转换(2D转换和3D转换):可以对元素进行移动.缩放.转动.拉长或拉伸. 2D转换:tra ...
- 延迟查询--LINQ
1.LINQ查询使用的是延迟查询的方法,以便提高效率 public static IEnumerable<TSource> Where<TSource>(this IEnume ...
- html常用样式
1.小手:style="cursor: pointer;" 2.滚动条:style="height: 1oopx;overflow: auto;"; 3.文本框 ...
- HTML的行内元素与块级元素的区别?
块级元素:独占一行,其宽度自动填满父元素的宽度,可以容纳行内元素和其他块级元素,可以设置margin和padding值. 行内元素:不会独占一行,与其他行内元素排成一行,直到其父元素拍不下,才会从新一 ...
- easyui datagrid 表格中操作栏 按钮图标不显示
jQuery EasyUI动态添加控件或者ajax加载页面后不能自动渲染 解决办法: 使用解析器 Parser(解析器) $.parser.parse(); // 解析所有页面 $.par ...
- StackTrack for debug
System.Diagnostics.Debug.WriteLine("Serial port. {0},{1}", this.GetType().FullName, new Sy ...
- 【MATLAB】对离散采样信号添加高斯白噪声(已知Eb/N0)
(1)首先计算已知信号序列(采样之后得到的信号)的平均功率.该序列在第n个点处的功率为: 如果已知的信号序列中的总共的点数为N个,则该序列的平均功率为: 在MATLAB中求平均功率的方法是: Pav= ...
- check_mk 之 Check Parameters
配置检测参数有几下方法 1. Creating manual checks instead of inventorized checks (using the variable checks). 2. ...
- Java 开发23种设计模式
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...