一、拦截器工作原理:

  根据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. C# winform 模拟键盘鼠标操作

    1.获取鼠标位置 private void timer1_Tick(object sender, EventArgs e) { // timer1.Stop(); // int x = Control ...

  2. 利用Volley封装好的图片缓存处理加载图片

    Volley 工具箱中提供了一种通过 DiskBasedCache 类实现的标准缓存.这个类能够缓存文件到磁盘的指定目录.但是为了使用 ImageLoader,我们应该提供一个自定义的内存 LRC b ...

  3. c语言函数指针

    #include <stdio.h> typedef void (*intFunc)(int i); void test1(int age) { printf("test1:%d ...

  4. easyui tabs update后tab上关闭图标失效的解决方案

    问题:使用easyui的tabs组件的时候,调用了tab的update方法,更新后的tab标签上的关闭图标失效 使用的js文件是1.3版本的jquery.easyui.min.js文件,通过读源文件发 ...

  5. iOS App 获取从后台返回前台时的页面

    产品美美的给小伙伴提了一个需求,当程序从后台进入前台时,如果是指定的页面,则弹出提示框. 大家首先想到的方法就是通过 AppDelegate.h 进行控制,相对复杂的步骤就是 在程序进入后台时对当前页 ...

  6. 算法-MergeSort

    #include <iostream> #include <vector> #include <iterator> using namespace std; ; v ...

  7. NethServer 7.2 RC1,增加深度数据包检测

    NethServer 7.2 RC1 "Saltimbocca"  发布了,NethServer是基于CentOS的面向服务器的Linux发行.该产品的主要特性是模块化的设计,这使 ...

  8. 采用ubuntu系统来安装tensorflow

    最近在学习google新开源的深度学习框架tensorflow.发现安装它的时候,需要依赖python2.7.X;我之前一直使用的linux是centos.而centos不更新了,里面的自带的pyth ...

  9. Bootstrap CSS概览代码文字标注篇

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  10. url中

    url中汉字被转换为UTF-8,通过此网址可以解析UTF-8编码.在地址栏中输入文字或者其它的,则可能输入法或者是相关的程序进行解析. http://www.mytju.com/classcode/t ...