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 ...
随机推荐
- 初始化git远程仓库步骤
Git global setup git config --global user.name "bingo" git config --global user.email &quo ...
- 使用git删除远程仓库文件
git rm -r -f --cached 文件或文件夹 git commit -m "移除文件或文件夹" git push origin master 注意:要删除的文件或文件夹 ...
- android开发中的问题集锦(慢慢搬运...)
1, android 设置ExpandableListView 系统默认箭头到右边 if(android.os.Build.VERSION.SDK_INT < android.os.Build. ...
- gucci fake bags is usually really a sign of luxurious
As soon as the violent trembling from the planet, standing company, people will certainly need to st ...
- extjs combobox
states.js中 Ext.example.states=[ ['AL','ALabama','The Heart of Dixie'], ['AK','Alaska','The Land of t ...
- JAVAFX纯手写布局
主页面效果: 第一栏的效果: 工程目录: package MessageBean; /** * * @author novo */ public class Message { private Str ...
- USB协议规范学习(一)
什么是USB OHCI规范? OHCI(Open HCI)是目前使用比较广泛的三种USB主机控制器规范之一.USB体系结构是由四个主要部分组成:客户软件/USB驱动,主机控制器驱动(HCD),主机控制 ...
- 前端和后台对时间数值的增减操作(JavaScript和C#两种方法)
最近在做一个视频回放项目,记录下一点总结. 应用背景: 假设有一个门禁系统记录着门禁的人员进出刷卡信息,门禁装有视频录像设备,现在要根据人员的刷卡时间调出其刷卡时间点前后一段时间的录像.关于视频回放部 ...
- 第3.3 案例2: 工作队列 job queue
第2个案例就是工作队列,典型的点对点的消息,一个Producer发送一个工作消息到队列去,具有Listener类的Consumer能够从工作队列中获得一个工作情况的消息,这个消息被这个消费者消费掉之后 ...
- Jquery DIV滚动至浏览器顶部后固定不动代码
$(function(){ //获取要定位元素距离浏览器顶部的距离 var navH = $(".win").offset().top; //滚动条事件 $(window).scr ...