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 ...
随机推荐
- C - CJSON
cJSON API 说明 cJSON_Version() 获得cJSON的版本 cJSON_InitHooks(); 初始化cJSON_Hooks结构体 cJSON_Parse(); 将字符串解析 ...
- 【上海站】EOLINKER 用户培训之旅,等你来共建API新连接
从今年3月4日起,EOLINKER AMS 团队将再次开启全国用户培训之旅.本次全国培训之旅依旧将覆盖北上广深等国内主要城市,重点提供两种服务内容,一是 对 EOLINKER 产品的交流,包括 API ...
- Appium 教您完美win10安装Appium1.7.2支持win客户端自动化
参考内容: https://testerhome.com/topics/10193https://testerhome.com/topics/8223https://testerhome.com/to ...
- Django CBV视图解决csrf认证
urls.py from django.conf.urls import url from appxx import views urlpatterns = [ url(r"^$" ...
- 实验十二 团队作业8:软件测试与Alpha冲刺 第五天
项目 内容 这个作业属于哪个课程 老师链接 这个作业的要求在哪里 实验十二 团队作业8:软件测试与Alpha冲刺 团队名称 Always Run! 作业学习目标 (1)掌握软件测试基础技术 (2)学习 ...
- 重庆OI2017 小 Q 的棋盘
小 Q 的棋盘 时间限制: 1 Sec 内存限制: 512 MB 题目描述 小Q正在设计一种棋类游戏.在小Q设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移 ...
- MAC OS下JDK版本切换指南
刚上手的用MAC开发的小伙伴们会发现,MAC自带JDK版本为1.6,通常会安装在 /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/目录下,但是更多 ...
- C/C++ uchar的一个有趣用法
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51377490 图像处理中常常使用的一种 ...
- Istio是啥?一文带你彻底了解!
原标题:Istio是啥?一文带你彻底了解! " 如果你比较关注新兴技术的话,那么很可能在不同的地方听说过 Istio,并且知道它和 Service Mesh 有着牵扯. 这篇文章可以作为了解 ...
- 详解Pattern类和Matcher类
java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现(建议在阅读本文时,打开java API文档,当介绍到哪个方法时,查看java API中的方法说明,效果 ...