struts2拦截器(四)
struts2拦截器原理:
当请求action时,struts2会查找配置文件,并根据配置实例化相对的 拦截器对象,然后串成一个列表,然后一个一个的调用列表中的拦截器。
比如:某些页面必须登录才可以访问,可以在每个action执行处理逻辑之前先判断是否已登录,但这种做法不利于代码复用,所以将这些检查是否登录的代码放到拦截器中进行。
自定义拦截器:
自定义拦截器首先要实现com.opensymphony.xwork2.interceptor.Interceptor接口,该接口有三个方法,init、destroy、intercept方法。
init():在服务器启动时加载一次,并且只加载一次。
destroy():当拦截器销毁时执行的方法。
Interceptor():拦截器核心方法,其中有一个参数actionInvocation。
actionInvocation.invoke()是如果只有一个拦截器执行完这个方法后,会返回给视图,如果有多个拦截器,它顺序的执行完所有的拦截器再返回给视图,也就是调用后面的action继续执行。
创建拦截器:
package com.struts2.web; import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor; //第一种创建方式 实现com.opensymphony.xwork2.interceptor.Interceptor接口
//拦截器生命周期:随着项目启动而创建,项目关闭而销毁
public class MyInterceptor implements Interceptor {
@Override
//初始化
public void init() { } @Override
//核心拦截方法
public String intercept(ActionInvocation actionInvocation) throws Exception {
return actionInvocation.invoke();
} @Override
//销毁
public void destroy() { }
}
package com.struts2.web; import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor; //第二种方式:继承com.opensymphony.xwork2.interceptor.AbstractInterceptor类
public class MyInterceptor2 extends AbstractInterceptor {
@Override
//直接实现拦截方法
public String intercept(ActionInvocation actionInvocation) throws Exception {
return actionInvocation.invoke();
}
}
package com.struts2.web; import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
//第三种方式:继承com.opensymphony.xwork2.interceptor.MethodFilterInterceptor类
public class MyInterceptor3 extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
//前处理
actionInvocation.invoke(); //放行
//后处理
return null;
}
}
第三种方式 MethodFilterInterceptor是继承了第二种方式的AbstractInterceptor类 第二种方式实现了第一种方式的Interceptor接口。
拦截器API
放行:actionInvocation.invoke();
前处理:放行前代码
后处理:放行后代码
不放行直接跳转到结果页面:return "success" 返回一个字符串,不执行后续的拦截器以及action。直接跳转到一个页面
拦截器配置
<package name="inter" namespace="/" extends="struts-default">
<interceptors>
<!--注册拦截器-->
<interceptor name="MyInterceptor3" class="com.struts2.web.MyInterceptor3"></interceptor>
<!--注册拦截器栈 -->
<interceptor-stack name="myStack">
<!--加入自定义的拦截器 -->
<interceptor-ref name="MyInterceptor3"></interceptor-ref>
<!--引用默认的拦截器栈(20个)-->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!--指定包中的默认拦截器栈 -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<action name="Demo1Action" class="com.struts2.web.Demo1Action" method="execute">
<result name="success">/demo1.jsp</result>
</action>
</package>
此时执行包中的action就会走拦截器的前处理 放行到action处理 最后后处理
指定方法调用拦截器
修改demo1 为多个方法的
public class Demo1Action extends ActionSupport {
public String execute(){
System.out.println("Demo1 Action execute");
return SUCCESS;
}
public String register(){
System.out.println("Demo1 Action register");
return SUCCESS;
}
public String login(){
System.out.println("Demo1 Action login");
return SUCCESS;
}
}
修改配置文件支持动态方法
<package name="inter" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="MyInterceptor3" class="com.struts2.web.MyInterceptor3"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="MyInterceptor3"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<global-allowed-methods>execute,login,register</global-allowed-methods>
<action name="Demo1Action_*" class="com.struts2.web.Demo1Action" method="{1}">
<result name="success">/demo1.jsp</result>
</action>
</package>
此时访问三个方法都是走拦截器的,修改配置文件如下
<package name="inter" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="MyInterceptor3" class="com.struts2.web.MyInterceptor3"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="MyInterceptor3">
<!--指定哪些方法不拦截-->
<param name="excludeMethods">login,register</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<global-allowed-methods>execute,login,register</global-allowed-methods>
<action name="Demo1Action_*" class="com.struts2.web.Demo1Action" method="{1}">
<result name="success">/demo1.jsp</result>
</action>
</package>
然后访问 login、register都不走自定义的拦截器了 includeMethods 哪些拦截 excludeMethods哪些方法不拦截 只可设置一种
实现登陆拦截器
public class MyInterceptor3 extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
Map<String, Object> session = ActionContext.getContext().getSession();
Object user = session.get("user");
//已登陆 放行
if(user != null){
return actionInvocation.invoke();
}else{
//没登陆 去登陆页面
return "toLogin";
}
}
}
全局配置结果集
<package name="inter" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="MyInterceptor3" class="com.struts2.web.MyInterceptor3"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="MyInterceptor3">
<param name="excludeMethods">login,register</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<!--定义全局结果集 -->
<global-results>
<result name="toLogin" type="redirect">login.jsp</result>
</global-results>
<global-allowed-methods>execute,login,register</global-allowed-methods>
<action name="Demo1Action_*" class="com.struts2.web.Demo1Action" method="{1}">
<result name="success">/demo1.jsp</result>
</action>
</package>
登陆代码
ActionContext.getContext().getSession().put("user","name");
前台 访问execute 自动跳转到登陆页面 登陆后 在访问execute 正常
struts2拦截器(四)的更多相关文章
- Struts2 拦截器配置以及实现
@(Java ThirdParty)[Struts|Interceptor] Struts2 拦截器配置以及实现 Struts2的拦截器应用于Action,可以在执行Action的方法之前,之后或者两 ...
- 浅谈Struts2拦截器的原理与实现
拦截器与过滤器 拦截器是对调用的Action起作用,它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了 ...
- (三)Struts2 拦截器
所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:拦截器简介 (百度百科Struts2) Struts2 拦截器是在访问某 ...
- Struts2拦截器总结<转>
由于项目中在登录跳转到其他应用程序模块的时候有用到拦截器,因此查看了一下相关资料. 原文地址:http://blog.csdn.net/sendfeng/article/details/4248120 ...
- Struts2拦截器配置实例
拦截器介绍 拦截器 的使用 ,源自Spring AOP(面向切面编程)思想 拦截器 采用 责任链 模式 * 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链. * 责任链每一个节 ...
- struts2(五)之struts2拦截器与自定义拦截器
前言 前面介绍了struts2的输入验证,如果让我自己选的话,肯定是选择xml配置校验的方法,因为,能使用struts2中的一些校验规则,就无需自己编写了, 不过到后面应该都有其他更方便的校验方法,而 ...
- struts2拦截器interceptor的配置方法及使用
转: struts2拦截器interceptor的配置方法及使用 (2015-11-09 10:22:28) 转载▼ 标签: it 365 分类: Struts2 NormalText Code ...
- struts2 拦截器
拦截器:对Action的访问.可以拦截到Action中某个方法.与过滤器不同,过滤器过滤的是请求.过滤JSP.html.但是拦截器不能拦截jsp.html的访问. Struts2 拦截器在访问某个 A ...
- Struts2拦截器的使用 (详解)
Struts2拦截器的使用 (详解) 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈default ...
随机推荐
- Highcharts教程--把js代码从html中抽离出来,放到单独的一个js文件中。由html页面调用
1.html页面写法 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- 51nod1103 N的倍数
[题解] 先预处理出模N意义下的前缀和sum[i]. 1.如果sum[i]=0,那么1~i的数之和就是N的倍数 2.sum[i]%N总共有0~N-1这N种情况:根据1,如果sum[i]为0则必定有解: ...
- nginx的安装部署以及使用
[介绍] nginx是现在互联上非常流行的高性能的 Web 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. 现在很多互联网应用都使用nginx来作为负载均衡的使用,再高并发 ...
- 解决Eclipse导入项目后Validating验证缓慢的问题
减少不必要的验证即可 步骤:Window-Preferences-左侧的Validation 如图所示,将Build一列的勾全部去掉就好了. 如需手动校验,右键项目名-选择Validate即可.
- hdu2004 成绩转换【C++】
成绩转换 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- [转]十五天精通WCF——第二天 告别烦恼的config配置
经常搞wcf的基友们肯定会知道,当你的应用程序有很多的“服务引用”的时候,是不是有一种疯狂的感觉...从一个环境迁移到另外一个环境,你需要改变的 endpoint会超级tmd的多,简直就是搞死了人.. ...
- PHP array_intersect_key()
定义和用法 array_intersect_key() 函数使用键名比较计算数组的交集. array_intersect_key() 返回一个数组,该数组包含了所有出现在被比较的数组中并同时出现在所有 ...
- 【JavaScript】离开页面前提示
离开页面前的提示不能够用onunload去做,由于它仅仅是兼容IE,你要兼容Google与FireFox就蛋疼了. 并且这个事件还是关闭之后才会触发的. 取而代之能够用onbeforeunload去实 ...
- MyBatis对数据库的增删改查操作,简单演示样例
之前一直有用Hibernate进行开发.近期公司在使用Mybatis.依据网上的演示样例,做了一个简单的Demo,以便日后复习 使用XMl方式映射sql语句 整体结构例如以下图 watermark/2 ...
- Android实战简易教程-第十五枪(实现ListView中Button点击事件监听)
1.main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" x ...