拦截器:

  Struts2的大多数核心功能都是通过拦截器实现的。拦截器之所以称之为“拦截器”,是因为它可以在执行Action之前或之后拦截下用户请求,执行一些操作,以增强Action方法的功能。

  Struts2内置了35种拦截器,每个拦截器完成相对独立的功能,多个拦截器的组合体称为拦截器栈。最为重要的拦截器栈是系统默认的拦截器栈DefaultStack。

  通常情况下,自定义一个普通的拦截器类需要实现拦截器接口Interceptor。该接口中定义了三个方法:

    public void init(); 拦截器实例被创建之前被调用

    public void destory(); 拦截器实例被销毁之前被调用

  public String intercept(ActionInvocation invocation) throws Exception:该方法在Action执行之前被调用,拦截器的附加功能在该方法中实现。执行参数invocation的invoke()方法,就是调用Action方法去执行。

    

  常用的拦截器(在struts-default.xml中可查):

    

   自定义权限拦截器:

    拦截器类的代码如下:   

package com.tongji.interceptors;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor; public class PermissionInterceptor implements Interceptor {
private static final long serialVersionUID = 2730133447721824856L; @Override
public void destroy() {
} @Override
public void init() {
} @Override
public String intercept(ActionInvocation invocation) throws Exception {
String user = (String) ActionContext.getContext().getApplication().get("user");
System.out.println(user);
if (!"qjj".equals(user)) {
System.out.println("bad");
return "fail";
}
//调用Action方法
return invocation.invoke();
} }

    注册拦截器的方式(注意拦截器是方法级的):

      (1)单个拦截器分别注册的方式:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="demo" namespace="/test" extends="struts-default">
<interceptors>
<interceptor name="permissionInterceptor" class="com.tongji.interceptors.PermissionInterceptor"/>
</interceptors>
<action name="system" class="com.tongji.actions.SystemAction">
<result>/welcome.jsp</result>
<result name="fail">/fail.jsp</result>
<!-- 一旦显示的声明了action要使用拦截器,则系统默认的拦截器栈defaultStack将不再执行-->
<interceptor-ref name="permissionInterceptor"/>
<interceptor-ref name="defaultStack"/>
</action>
</package>
</struts>

      (2)拦截器栈的注册方式:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="demo" namespace="/test" extends="struts-default">
<interceptors>
<interceptor name="permissionInterceptor" class="com.tongji.interceptors.PermissionInterceptor"/>
<interceptor-stack name="permissionStack">
<interceptor-ref name="permissionInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors> <action name="system" class="com.tongji.actions.SystemAction">
<result>/welcome.jsp</result>
<result name="fail">/fail.jsp</result>
<interceptor-ref name="permissionStack"/>
</action>
</package>
</struts>

      (3)默认拦截器的注册方式:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="demo" namespace="/test" extends="struts-default">
<interceptors>
<interceptor name="permissionInterceptor" class="com.tongji.interceptors.PermissionInterceptor"/>
<interceptor-stack name="permissionStack">
<interceptor-ref name="permissionInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 默认的拦截器:当前包中只要没有显示声明使用的拦截器,则就会执行该默认拦截器 -->
<default-interceptor-ref name="permissionStack"></default-interceptor-ref> <action name="system" class="com.tongji.actions.SystemAction">
<result>/welcome.jsp</result>
<result name="fail">/fail.jsp</result>
</action>
</package>
</struts>

  补充:

    (1)方法过滤拦截器:

      拦截器类代码如下(注意继承自MethodFilterInterceptor抽象类,当然这个抽象类最后也是实现Interceptor接口的):

package com.tongji.interceptors;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; public class PermissionInterceptor extends MethodFilterInterceptor{
private static final long serialVersionUID = 6243069277042908932L; @Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
System.out.println("执行拦截器");
return invocation.invoke();
} }

    方法过滤拦截器的注册方式:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="demo" namespace="/test" extends="struts-default">
<interceptors>
<interceptor name="permissionInterceptor" class="com.tongji.interceptors.PermissionInterceptor">
<!-- <param name="includeMethods">doFirst</param> -->
<param name="excludeMethods">doSecond,doThird</param>
</interceptor>
<interceptor-stack name="permissionStack">
<interceptor-ref name="permissionInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors> <action name="some_*" class="com.tongji.actions.SomeAction" method="{1}">
<result>/welcome.jsp</result>
<interceptor-ref name="permissionInterceptor" />
</action>
</package>
</struts>

   (2)拦截器的执行顺序与注册顺序相同:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="demo" namespace="/test" extends="struts-default">
<interceptors>
<interceptor name="oneInterceptor" class="com.tongji.interceptors.OneInterceptor"/>
<interceptor name="twoInterceptor" class="com.tongji.interceptors.TwoInterceptor"/>
<!-- 拦截器的执行顺序与其注册顺序相同 -->
<interceptor-stack name="myStack">
<interceptor-ref name="twoInterceptor"></interceptor-ref>
<interceptor-ref name="oneInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors> <action name="system" class="com.tongji.actions.SystemAction">
<result>/welcome.jsp</result>
<result name="fail">/fail.jsp</result>
<interceptor-ref name="myStack"/>
</action>
</package>
</struts>

      先执行twoInterceptor,再执行oneInterceptor。

Strusts2--课程笔记6的更多相关文章

  1. Linux内核分析课程笔记(一)

    linux内核分析课程笔记(一) 冯诺依曼体系结构 冯诺依曼体系结构实际上就是存储程序计算机. 从两个层面来讲: 从硬件的角度来看,冯诺依曼体系结构逻辑上可以抽象成CPU和内存,通过总线相连.CPU上 ...

  2. (1/18)重学Standford_iOS7开发_iOS概述_课程笔记

    写在前面:上次学习课程对iOS还是一知半解,由于缺乏实践,看公开课的视频有时不能很好地领会知识.带着问题去学习永远是最好的方法,接触一段时间iOS开发以后再来看斯坦福iOS公开课,又会有许多新的发现, ...

  3. Andrew Ng机器学习课程笔记(五)之应用机器学习的建议

    Andrew Ng机器学习课程笔记(五)之 应用机器学习的建议 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7368472.h ...

  4. Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归)

    title: Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归) tags: 机器学习, 学习笔记 grammar_cjkRuby: true --- 之前看过一遍,但是总是模 ...

  5. Andrew Ng机器学习课程笔记--汇总

    笔记总结,各章节主要内容已总结在标题之中 Andrew Ng机器学习课程笔记–week1(机器学习简介&线性回归模型) Andrew Ng机器学习课程笔记--week2(多元线性回归& ...

  6. Andrew 机器学习课程笔记

    Andrew 机器学习课程笔记 完成 Andrew 的课程结束至今已有一段时间,课程介绍深入浅出,很好的解释了模型的基本原理以及应用.在我看来这是个很好的入门视频,他老人家现在又出了一门 deep l ...

  7. 操作系统学习笔记----进程/线程模型----Coursera课程笔记

    操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进 ...

  8. 《CSS动画实用技巧》课程笔记

    概述 这是我学习[CSS动画实用技巧][1]的课程笔记 常用动画属性--transition [常用动画属性--transition][2] .change img{ display:block; w ...

  9. Deeplearning.ai课程笔记--汇总

    从接触机器学习就了解到Andrew Ng的机器学习课程,后来发现又出来深度学习课程,就开始在网易云课堂上学习deeplearning.ai的课程,Andrew 的课真是的把深入浅出.当然学习这些课程还 ...

  10. selenium课程笔记

    selenium课程笔记第一天(2017-7-1) 一.配置火狐浏览器 运行:firefox.exe -p -no -remote selenium课程笔记第二天 用Eclipse+java+sele ...

随机推荐

  1. Android开发(24)---安卓中实现多线程下载(带进度条和百分比)

    当我们学完java中多线程的下载后,可以将它移植到我们的安卓中来,下面是具体实现源码: DownActivity.java package com.example.downloads; import ...

  2. ES 6 : 函数的扩展

    1. 函数参数的默认值 [ 基本用法 ] 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法. 上面的代码检查函数log的参数y有没有赋值,如果没有,则指定默认值为world.这种写法的 ...

  3. JavaScript的this详解

    1.全局作用域下的this: 2.一般函数与严格模式下的函数的this: 3.当函数的this作为对象的方法的情况下: 4.对象原型链上的this: 对象P的原型指向o, p.a与p.a创建对象p的属 ...

  4. swift3.0 运行时获取类的属性

    //定义Person类 class Person: NSObject { var name: String? //注意这里基本数据类型我定义的是必选属性 var age: Int = override ...

  5. dev gridcontrol 绑定int型及日期型的列默认当值为0时显示空白及格式化日期显示方式

    xmlns:sys="clr-namespace:System;assembly=mscorlib" 如只显示日期的时间部分 <dxg:GridColumn Header=& ...

  6. webpack学习笔记—webpack安装、基本配置

    文章结构: 什么是webpack? 安装webpack 'webpack基本配置 一.什么是webpack? 在学习react时发现大部分文章都是react和webpack结合使用的,所以在学reac ...

  7. 在Windows上创建同样的Linux操作环境

    在之前的文章中,介绍了我在GNU/Linux图形界面环境下所使用的工具集合.其基本目的是在保证占用最少系统资源的条件下,将电脑操作效率推向极致.这样的工具组合尤如瑞士军刀一般,简洁.高效.功能全面.与 ...

  8. git的入门使用操作

    Git html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,addres ...

  9. HOOK(钩子)函数

    安装.卸载钩子的相关函数 钩子类型 按功能分: 1.WH_CALLWNDPROC和WH_CALLWNDPROCRET:使你可以监视发送到窗口过程的消息3.WH_DEBUG    调试钩子4.WH_FO ...

  10. 接口测试:如何定位BUG的产生原因

    转自公众号<QA之道> 我们从在日常功能测试过程中对UI的每一次操作说白了就是对一个或者多个接口的一次调用,接口的返回的内容(移动端一般为json)经过前端代码的处理最终展示在页面上.ht ...