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 ...
随机推荐
- html中frameset简介
1, 只 要 <FRAMESET> <FRAME> 两个标签,框架便是网页画面分成几个框窗,同时取得多个 URL. 2, 该框架只记录如何划分,不会显示任何资料.所以不必放入 ...
- C++变量初始化问题
初始化和赋值的区别 在C++中,变量初始化和赋值操作符是两个完全不同的概念. 初始化不是赋值,初始化的含义是创建变量分配存储空间时为其赋一个初始值,而赋值的含义是把内存空间的当前值擦除,用一个新值代替 ...
- Bootstrap <基础二十五>警告(Alerts)
警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...
- 使用CSS3线性渐变实现图片闪光划过效果
<p class="overimg"> <a><img src="http://www.nowamagic.net/librarys/ima ...
- matlab 使用札记
1.inline 命令行内置函数,作用同Function一致 2.repmat B = repmat(A,m,n)B = repmat(A,[m n])B = repmat(A,[m n p...]) ...
- 用Window Authentication的方式去连接SQLServer
用Window Authentication的方式去连接SQLServer Connection String: jdbc:sqlserver://${serverName};databaseName ...
- DOM扩展之 HTML5
11.3.1 与类相关的扩充 2. classList属性 在操作类名时,需要通过className属性添加,删除和替换类名.因为className是一个字符串,所以即使只修改一部分内容也要设置整个字 ...
- C#同一项目中不同文件或类中的方法进行调用
有两种方法,一是将被调用的类设置成静态类Static,这样就可以直接点出来了,二是将被调用的方法所在类设置成public,这几必须在调用类中先将被调用的类进行实体化,new()出来,再点出来. 一. ...
- 修改 Docker 默认网桥地址
在公司里搭建docker测试环境,需要访问内部的服务, 由于网段是172.17.导致该容器没有办法正常访问公司内部服务.翻了一下官方的帮助文档,找到了修改默认网桥地址的办法. 首先停止正在使用的 Do ...
- WCF Restful 服务器配置文件
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSec ...