一、拦截器工作原理:

  根据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学习笔记(拦截器配置添加)的更多相关文章

  1. struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo

    理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...

  2. 1.5(Spring MVC学习笔记) 拦截器(Interceptor)

    一.拦截器 1.1拦截器简介 Spring中的拦截器类似Servlet中的过滤器(Filter),主要用于拦截用户请求, 并进行一定的处理操作(如验证权限.记录日志.设置编码方式等). 1.2拦截器实 ...

  3. struts2学习(5)拦截器简介以及例子执行过程

    一.拦截器简介: 二.Struts2预定义拦截器&拦截器栈 在执行action之前和之后,拦截器进行了操作: 比如struts-default.xml中就有很多预定义的拦截器:   拦截器栈: ...

  4. Struts2学习之拦截器

    © 版权声明:本文为博主原创文章,转载请注明出处 拦截器: - Struts2大多数核心功能都是通过拦截器实现的,每个拦截器完成某项功能 - 拦截器方法在Action执行之前或之后执行 工作原理: - ...

  5. SpringMVC 学习笔记(拦截器的配置))

    在设置SpringMVC的拦截器时,需要在SpringMVC中配置 拦截器对象,拦截器的的对象要 实现 HandlerInterceptor 接口 拦截器类的设置: public class inte ...

  6. Struts 2学习笔记——拦截器相关

    一.添加国际化支持 默认的struts-deault.xml文件中已经定义了国际化拦截器,内容如下 <!-定义国际化拦截器--> <interceptor name="i1 ...

  7. Struts2学习之拦截器栈

    © 版权声明:本文为博主原创文章,转载请注明出处 拦截器栈: - 从结构上看:拦截器栈相当于多个拦截器的组合 - 从功能上看:拦截器栈也是拦截器 默认拦截器栈: - 在struts-core.jar中 ...

  8. Struts2学习笔记(三):result配置的各项视图转发类型

    Struts 1: <action path="/user" type="org.sunny.user.action.UserAction" ...> ...

  9. struts2学习笔记(六)—— 拦截器

    一.拦截器概述 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前进行拦截,然后在之前或之后加入某些操作.拦截器是AOP的一种实现策略. 在We ...

随机推荐

  1. 通过npm安装 Cordova

    通过npm安装 Cordova 首先请确保你在本地已经安装了NodeJS(可以调用npm命令), 并且是联网状态的.如果不知道如何安装NodeJS, 请参考 ”四步完成NodeJS安装,配置和测试”. ...

  2. Mysql触发器示例

    begin ); ); ); then set x = (select ID from qn_huiyuan_grade g ); elseif r then set x = (select ID f ...

  3. Android源码编译出错解决办法

    编译环境:Ubuntu12.04 64位 Android源码:Android 4.3 以下问题是笔者亲自碰到,通过网上查询整合在一起的. 1.error while loading shared li ...

  4. js中,全局变量与直接添加在window属性的区别

    在js中定义的全局变量是挂在window下的,而window的属性也一样,那么这两者有什么区别呢? 其实这两者还是有小小的区别的,全局变量是不能通过delete操作符删除的,而直接定义在window上 ...

  5. CodeForces 474B E(Contest #1)

    题意: 给你一个数n,代表n段区间,接下来有n个数(a1,a2,...an)代表每段区间的长度,第一段区间为[1,a1],第二段区间为[a1+1,a1+a2],...第i段区间为[ai-1+1,ai- ...

  6. java多线程总结

    java中的多线程 一般来说,当运行一个应用程序的时候,就启动了一个进程,当然有些会启动多个进程.启动进程的时候,操作系统会为进程分配资源,其中最主要的资源是内存空间,因为程序是在内存中运行的.在进程 ...

  7. 火狐和IE浏览器的兼容问题汇总

    1.window.event code=(navigator.appName="Netscape")?event.which:event.keycode; 2.event.x mx ...

  8. ueditor工具栏更改按钮的默认操作

    ueditor 上的 image 按钮,默认有一个图片选择工具. 但是我想把他去掉,用上自己写的图片选择功能. 原来使用cleditor 是可以给按钮自定义一个函数.但是在ueditor就没有找到可以 ...

  9. 开源一个网络图片浏览器HooPhotoBrowser

    在公司开发项目中需要弹出展示从网络上下载的图片,并提供滑动展示功能.目前采用同事开发的图片浏览器,后期有时间想优化一下.所以重温了下以前开发的类似微博的项目中的图片浏览器代码,并抽取出来封装成了现在这 ...

  10. 通过JavaScript改变HTML样式

    语法:Object.style.property=new style; 基本属性表如下: 示例: 改变 <p> 元素的样式,将颜色改为红色,字号改为20,背景颜色改为蓝: <p id ...