Struts2学习笔记(拦截器配置添加)
一、拦截器工作原理:
根据Struts2的工作原理图,拦截器在action执行前进行顺序调用,之后执行Action并返回结果字符串,再逆序调用拦截器。(结构类似递归方式。。。)大部分时候,拦截器方法都是通过代理的方式来调用的。Struts2的拦截器实现相对简单,当请求到达Struts2的ServletDispatcher时,Struts2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。事实上,我们之所以能够如此灵活地使用拦截器,完全归功于“动态代理”的使用。动态代理是代理对象根据客户的需求做出不同的处理。对于客户来说,只要知道一个代理对象就行了。那Struts2中,拦截器通过动态代理被调用。当Action请求到来的时候,会由系统的代理生成一个Action的代理对象,由这个代理对象调用Action的execute()或指定的方法,并在struts.xml中查找与该Action对应的拦截器。如果有对应的拦截器,就在Action的方法执行前(后)调用这些拦截器;如果没有对应的拦截器则执行Action的方法。其中系统对于拦截器的调用,是通过ActionInvocation来实现的。
二、实现过程:
1.定义拦截器:
两种方法,一为继承Interceptor接口;该接口声明了三种方法,
void init(); //初始化资源,可空实现;
void destory(); //回收资源,可空实现;
String intercept(ActionInvocation invocation) throws Exception; //拦截器主要实现方法
二为继承AbstractInterceptor类(不需要重写init与destroy方法时可选);拦截器的实现方法同样为
String intercept(ActionInvocation invocation) throws Exception;(大多数情况下选择第二种)
例子(检测登录权限的拦截器):
public class CheckLoginInterceptor extends AbstractInterceptor{
@override
public String intercept(ActionInvocation invocation) throws Exception{
//获取action的context!!!!!!!!!!!!!!!!!!!!!一定要获取context才能进行session的调用,且session为map类型。。。
ActionContext context = ActionContext.getContext();
//获取session
Map<String,Object> sesson = context.getSession();
//通过session中是否存在用户信息判断登陆状态
if(session.get("loginuser")!=null){
//已登录,通过invocation对象的invoke()方法跳转到下一步,可执行下一个拦截器,无拦截器则跳转到action;
//String用来接收传递参数;
String result = invocation.invoke();
return result;
}else{
//未登录执行登陆的跳转;
return "login";
}
}
}
2.在Struts2的配置文件中注册并引用拦截器:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts> <!-- 添加常量设置 -->
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" /> <package name="default" namespace="/" extends="struts-default">
<!-- <******!!!!!!******> -->
<!-- 注册拦截器 -->
<interceptors>
<!-- 定义拦截器 -->
<interceptor name="auth" class="com.interceptor.CheckLoginInterceptor"></interceptor> <!-- 可定义拦截器栈 -->
<interceptor-stack name="myStack">
<!-- 栈内包含的通用为拦截器的引用 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="auth"></interceptor-ref>
</interceptor-stack>
</interceptors> <!-- 因为action未添加自定义拦截器引用时会调用默认拦截器,所以添加自定义拦截器同时需添加默认拦截器栈!一种便捷实现方法为在注册拦截器时添加拦截器栈,并在栈中首先添加默认拦截器栈,再添加自定义拦截器~ --> <!-- 通过链接“auth”这个action可直接访问管理页面,需要为其添加拦截器 -->
<action name="auth" >
<result >manageUser.jsp</result>
<result name="login">login.jsp</result> <!-- <******!!!!!!******> -->
<!-- 通过引用自定义的拦截器栈,对该action添加拦截器 -->
<interceptor-ref name="myStack"></interceptor-ref>
</action> <!-- 登陆action,略 -->
<action name="dologin" class="" method="">
<result name="ERROR">login.jsp</result>
<!-- 默认登陆成功后,直接跳转至管理页面 -->
<result >manageUser.jsp</result>
</package>
</struts>
Struts2学习笔记(拦截器配置添加)的更多相关文章
- struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo
理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...
- 1.5(Spring MVC学习笔记) 拦截器(Interceptor)
一.拦截器 1.1拦截器简介 Spring中的拦截器类似Servlet中的过滤器(Filter),主要用于拦截用户请求, 并进行一定的处理操作(如验证权限.记录日志.设置编码方式等). 1.2拦截器实 ...
- struts2学习(5)拦截器简介以及例子执行过程
一.拦截器简介: 二.Struts2预定义拦截器&拦截器栈 在执行action之前和之后,拦截器进行了操作: 比如struts-default.xml中就有很多预定义的拦截器: 拦截器栈: ...
- Struts2学习之拦截器
© 版权声明:本文为博主原创文章,转载请注明出处 拦截器: - Struts2大多数核心功能都是通过拦截器实现的,每个拦截器完成某项功能 - 拦截器方法在Action执行之前或之后执行 工作原理: - ...
- SpringMVC 学习笔记(拦截器的配置))
在设置SpringMVC的拦截器时,需要在SpringMVC中配置 拦截器对象,拦截器的的对象要 实现 HandlerInterceptor 接口 拦截器类的设置: public class inte ...
- Struts 2学习笔记——拦截器相关
一.添加国际化支持 默认的struts-deault.xml文件中已经定义了国际化拦截器,内容如下 <!-定义国际化拦截器--> <interceptor name="i1 ...
- Struts2学习之拦截器栈
© 版权声明:本文为博主原创文章,转载请注明出处 拦截器栈: - 从结构上看:拦截器栈相当于多个拦截器的组合 - 从功能上看:拦截器栈也是拦截器 默认拦截器栈: - 在struts-core.jar中 ...
- Struts2学习笔记(三):result配置的各项视图转发类型
Struts 1: <action path="/user" type="org.sunny.user.action.UserAction" ...> ...
- struts2学习笔记(六)—— 拦截器
一.拦截器概述 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前进行拦截,然后在之前或之后加入某些操作.拦截器是AOP的一种实现策略. 在We ...
随机推荐
- ionic环境搭建及新建项目中的各种问题
具体流程可见http://bbs.ionic-china.com/read-7.html 问题1.安装ionic cordova失败 解决方法:修改npm的源,npm config set regis ...
- 获取数据库表详细信息、存储过程、视图、的sql
select s.[name] + '.' + t.[name] as tablename from sys.tables as t,sys.schemas as s where t.schema_i ...
- Three.Js学习第一天
因为工作需求,最近接触到了ThreeJs库,国内学习文档的确少,所以在这里写下bolgs记录学习史,并且给后面学习的人尽一份微博之力. 3D场景依靠WebGL技术.目前支持比较好的浏览器,谷歌.火狐. ...
- Intellij IDEA 创建Web项目并在Tomcat中部署运行(不使用maven)【转载】
原文链接:http://www.thinksaas.cn/topics/0/350/350000.html 一.创建Web项目 1.File -> New Module,进入创建项目窗口 2.选 ...
- 黑马程序员——C语言基础 char字符 数组
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)char类型 1)存储细节 ASCII单字节表(双字节GBK\GB2 ...
- eclipse 导入工程报错Unable to execute dex: Multiple dex files define Landroid/annotation/SuppressLint
对策: 检查libs 是否有重复加载的.
- ShellShock 攻击实验
一. 实验描述 2014年9月24日,Bash中发现了一个严重漏洞shellshock,该漏洞可用于许多系统,并且既可以远程也可以在本地触发.在本实验中,学生需要亲手重现攻击来理解该漏洞,并回答一些问 ...
- AngularJs的UI组件ui-Bootstrap分享(一)
最近几个月学习了AngularJs和扩展的UI组件,并在公司小组内做了一次分享交流,感觉很有收获,在此记录下个人的学习心得. 目录: AngularJs的UI组件ui-Bootstrap分享(一) A ...
- 设计模式之observer and visitor
很长时间一直对observer(观察者)与visitor(访问者)有些分不清晰. 今天有时间进行一下梳理: 1.observer模式 这基本就是一个通知模式,当被观察者发生改变时,通知所有监听此变化的 ...
- js控制select下拉列表数据绑定
JS代码部分: <script type="text/javascript"> $(document).ready(function () { $("sel ...