Strusts2笔记6--拦截器
拦截器:
Struts2的大多数核心功能都是通过拦截器实现的。拦截器之所以称之为“拦截器”,是因为它可以在执行Action之前或之后拦截下用户请求,执行一些操作,以增强Action方法的功能。
Struts2内置了35种拦截器,每个拦截器完成相对独立的功能,多个拦截器的组合体称为拦截器栈。最为重要的拦截器栈是系统默认的拦截器栈DefaultStack。
通常情况下,自定义一个普通的拦截器类需要实现拦截器接口Interceptor。该接口中定义了三个方法:
public void init(); 拦截器实例被创建之前被调用
public void destory(); 拦截器实例被销毁之前被调用
public String intercept(ActionInvocation invocation) throws Exception:该方法在Action执行之前被调用,拦截器的附加功能在该方法中实现。执行参数invocation的invoke()方法,就是调用Action方法去执行。

常用的拦截器(在struts-default.xml中可查):

自定义权限拦截器:
拦截器类的代码如下:
package com.tongji.interceptors; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor; public class PermissionInterceptor implements Interceptor {
private static final long serialVersionUID = 2730133447721824856L; @Override
public void destroy() {
} @Override
public void init() {
} @Override
public String intercept(ActionInvocation invocation) throws Exception {
String user = (String) ActionContext.getContext().getApplication().get("user");
System.out.println(user);
if (!"qjj".equals(user)) {
System.out.println("bad");
return "fail";
}
//调用Action方法
return invocation.invoke();
} }
注册拦截器的方式(注意拦截器是方法级的):
(1)单个拦截器分别注册的方式:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="demo" namespace="/test" extends="struts-default">
<interceptors>
<interceptor name="permissionInterceptor" class="com.tongji.interceptors.PermissionInterceptor"/>
</interceptors>
<action name="system" class="com.tongji.actions.SystemAction">
<result>/welcome.jsp</result>
<result name="fail">/fail.jsp</result>
<!-- 一旦显示的声明了action要使用拦截器,则系统默认的拦截器栈defaultStack将不再执行-->
<interceptor-ref name="permissionInterceptor"/>
<interceptor-ref name="defaultStack"/>
</action>
</package>
</struts>
(2)拦截器栈的注册方式:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="demo" namespace="/test" extends="struts-default">
<interceptors>
<interceptor name="permissionInterceptor" class="com.tongji.interceptors.PermissionInterceptor"/>
<interceptor-stack name="permissionStack">
<interceptor-ref name="permissionInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors> <action name="system" class="com.tongji.actions.SystemAction">
<result>/welcome.jsp</result>
<result name="fail">/fail.jsp</result>
<interceptor-ref name="permissionStack"/>
</action>
</package>
</struts>
(3)默认拦截器的注册方式:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="demo" namespace="/test" extends="struts-default">
<interceptors>
<interceptor name="permissionInterceptor" class="com.tongji.interceptors.PermissionInterceptor"/>
<interceptor-stack name="permissionStack">
<interceptor-ref name="permissionInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 默认的拦截器:当前包中只要没有显示声明使用的拦截器,则就会执行该默认拦截器 -->
<default-interceptor-ref name="permissionStack"></default-interceptor-ref> <action name="system" class="com.tongji.actions.SystemAction">
<result>/welcome.jsp</result>
<result name="fail">/fail.jsp</result>
</action>
</package>
</struts>
补充:
(1)方法过滤拦截器:
拦截器类代码如下(注意继承自MethodFilterInterceptor抽象类,当然这个抽象类最后也是实现Interceptor接口的):
package com.tongji.interceptors; import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; public class PermissionInterceptor extends MethodFilterInterceptor{
private static final long serialVersionUID = 6243069277042908932L; @Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
System.out.println("执行拦截器");
return invocation.invoke();
} }
方法过滤拦截器的注册方式:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="demo" namespace="/test" extends="struts-default">
<interceptors>
<interceptor name="permissionInterceptor" class="com.tongji.interceptors.PermissionInterceptor">
<!-- <param name="includeMethods">doFirst</param> -->
<param name="excludeMethods">doSecond,doThird</param>
</interceptor>
<interceptor-stack name="permissionStack">
<interceptor-ref name="permissionInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors> <action name="some_*" class="com.tongji.actions.SomeAction" method="{1}">
<result>/welcome.jsp</result>
<interceptor-ref name="permissionInterceptor" />
</action>
</package>
</struts>
(2)拦截器的执行顺序与注册顺序相同:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="demo" namespace="/test" extends="struts-default">
<interceptors>
<interceptor name="oneInterceptor" class="com.tongji.interceptors.OneInterceptor"/>
<interceptor name="twoInterceptor" class="com.tongji.interceptors.TwoInterceptor"/>
<!-- 拦截器的执行顺序与其注册顺序相同 -->
<interceptor-stack name="myStack">
<interceptor-ref name="twoInterceptor"></interceptor-ref>
<interceptor-ref name="oneInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors> <action name="system" class="com.tongji.actions.SystemAction">
<result>/welcome.jsp</result>
<result name="fail">/fail.jsp</result>
<interceptor-ref name="myStack"/>
</action>
</package>
</struts>
先执行twoInterceptor,再执行oneInterceptor。
Strusts2笔记6--拦截器的更多相关文章
- Struts2学习笔记(拦截器配置添加)
一.拦截器工作原理: 根据Struts2的工作原理图,拦截器在action执行前进行顺序调用,之后执行Action并返回结果字符串,再逆序调用拦截器.(结构类似递归方式...)大部分时候,拦截器方法都 ...
- Struts2笔记——自定义拦截器
需要两个步骤,自定义类实现拦截器接口和在struts.xml注册拦截器 =============================== 1.自定义类实现com.opensymphony.xwork2. ...
- Struts2 学习笔记18 拦截器原理分析
我们来进行一下拦截器的原理分析,从Struts2的源代码开始,然后我们手动创建一个项目进行模拟.(源代码需要下载然后添加好才能看到)我们可以用Debug来读源码. 从doFilter开始执行,流程如图 ...
- Struts2学习笔记五 拦截器
拦截器,在AOP中用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作.拦截是AOP的一种实现策略. Struts2中,拦截器是动态拦截Action调用的对象.它提供了一种机制可以使 ...
- Struts2笔记_拦截器
A.拦截器是什么 --- Interceptor:拦截器,起到拦截Action的作用. ---Filter:过滤器,过滤从客户端向服务器发送的请求. ---Interceptor:拦截器,拦截是客户端 ...
- SpringMVC学习笔记:拦截器和过滤器
首先说明一下二者的区别: 1. 拦截器基于java的反射机制,而过滤器是基于函数回调 2. 拦截器不依赖于servlet容器,过滤器依赖servlet容器 3. 拦截器只能对action请求起作用,而 ...
- Struts框架笔记04_拦截器_标签库
目录 1. Struts2的拦截器 1.1 拦截器概述 1.2 拦截器的实现原理 1.3 Struts的执行流程 1.4 拦截器入门 1.4.1 环境搭建 1.4.2 编写拦截器 1.4.3 配置拦截 ...
- mybatis源码探索笔记-5(拦截器)
前言 mybatis中拦截器主要用来拦截我们在发起数据库请求中的关键步骤.其原理也是基于代理模式,自定义拦截器时要实现Interceptor接口,并且要对实现类进行标注,声明是对哪种组件的指定方法进行 ...
- SpringMVC学习笔记九:拦截器及拦截器的简单实用
SpringMVC中的interceptor拦截器是非常重要的,它的主要作用就是拦截指定的用户请求,并进行相应的预处理和后处理. 拦截时间点在"处理器映射器根据用户提交的请求映射出所要执行的 ...
随机推荐
- Spring、MyBatis和SpringMVC整合的jar包下载
spring mvc的jar包下载:http://repo.springsource.org/libs-release-local/org/springframework/spring/我下载的5.0 ...
- BZOJ4561 JLOI2016圆的异或并(扫描线+平衡树)
考虑一条扫描线从左到右扫过这些圆.观察某一时刻直线与这些圆的交点,可以发现构成一个类似括号序列的东西,括号的包含关系与圆的包含关系是相同的.并且当扫描线逐渐移动时,括号间的相对顺序不变.于是考虑用se ...
- static变量 方法 类 和final
static变量:声明为static的变量实质上就是全局变量.当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量.静态变量与静态方法类似.所有此类实例共 ...
- ajax发送post请求遇到的坑
前端小白的我. 用django-rest-framework写好了一个接口.如下,就接收两个字符串参数. 前端写了一个简单的提交post请求到这个接口,如下 浏览器提交请求后,一直提示 400 Bad ...
- 【NOI】荷马史诗
追逐影子的人,自己就是影子 ——荷马 Allison最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛>和< ...
- 【BZOJ1045】糖果传递(贪心)
[BZOJ1045]糖果传递(贪心) 题面 BZOJ 洛谷 题解 秉承者娱乐精神,我们必须写一个费用流,并且相信信仰跑不过去. 于是写了一个\(zkw\)费用流如下:(您可以无视此份代码) #incl ...
- BZOJ2142 礼物 【扩展Lucas】
题目 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多.小E从商店中购买了n件礼物, ...
- Android 资源目录 相关知识 raw、 drawable、 values..
一定要看的 Android 资源目录的相关知识 raw drwable valueshttp://blog.csdn.net/shichexixi/article/details/5985677 ht ...
- go语言操作mongodb
Install the MongoDB Go Driver The MongoDB Go Driver is made up of several packages. If you are just ...
- C++ public private protect 继承关系(链接)
基础链接 总结: public继承基类成员访问权限没有变化; protected继承基类public和protected权限变为protected,基类private不变. private继承基类p ...