Struts2学习:interceptor(拦截器)的使用
对于需要登陆验证、权限验证等功能的网站,每一次请求,每一个action都写一段验证的代码,未免显得冗余且不易维护。struts2提供了拦截器interceptor,为这些页面提供一个切面,或者说公共组件,以达到易维护、提高代码重用率的目的。struts默认的interceptor有很多,就不去一一列举,这里从自定义拦截器开始学习。
1、定义一个自定义拦截器:

package com.owlforest.home.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class MyInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation invocation) throws Exception {
String output = "Pre-Processing";
System.out.println(output);
String result = invocation.invoke();
output = "Post-Processing";
System.out.println(output);
return result;
}
}
2、修改struts.xml,在package中声明和使用拦截器MyInterceptor
<package name="suibian" extends="struts-default">
<!--声明自定义的拦截器-->
<interceptors>
<interceptor name="myinterceptor"
class="com.owlforest.home.interceptor.MyInterceptor" />
</interceptors>
<action name="hello" class="com.owlforest.home.action.HelloWorldAction"
method="excute">
<!--使用自定义拦截器-->
<interceptor-ref name="myinterceptor" />
<interceptor-ref name="params"/>
<result name="success">/HelloWorld.jsp</result>
</action>
</package>
该拦截器在com.owlforest.home.action.HelloWorldAction执行前后会生效,为了便于理解,附上该Action的代码:
package com.owlforest.home.action;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport {
private String name;
public String excute(){
System.out.println("excute");
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3、执行程序
程序实现参照Struts2学习:HelloWorld
执行action过后可查看控制台输出,看到下面的信息后及说明生效。

4、对于一个struts.xml里面的package,可能有多个action,多个action可能会用到一系列的相同的interceptor,如果每个action都要写一系列相同的拦截器,则很难维护。struts2提供了拦截器栈,来帮助整合这些拦截器,达到复用的目的。
为了方便理解,我写了两个自定义的拦截器MyInterceptor和SecInterceptor
package com.owlforest.home.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class MyInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation invocation) throws Exception {
String output = "Pre-Processing 拦截器MyInterceptor";
System.out.println(output);
String result = invocation.invoke();
output = "Post-Processing 拦截器MyInterceptor";
System.out.println(output);
return result;
}
}
package com.owlforest.home.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class SecInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation invocation) throws Exception {
String output = "Pre-Processing SecInterceptor";
System.out.println(output);
String result = invocation.invoke();
output = "Post-Processing SecInterceptor";
System.out.println(output);
return result;
}
}
配置struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 设置struts是否为开发模式,默认为false,测试阶段一般设为true. -->
<constant name="struts.devMode" value="true"/>
<package name="suibian" extends="struts-default">
<interceptors>
<interceptor name="myinterceptor"
class="com.owlforest.home.interceptor.MyInterceptor" />
<interceptor name="secinterceptor"
class="com.owlforest.home.interceptor.SecInterceptor" />
<interceptor-stack name="myinterceptorstack">
<interceptor-ref name="myinterceptor" />
<interceptor-ref name="secinterceptor" />
</interceptor-stack>
</interceptors>
<action name="hello" class="com.owlforest.home.action.HelloWorldAction"
method="excute">
<interceptor-ref name="myinterceptorstack"/>
<interceptor-ref name="params"/>
<result name="success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
5、因为拦截器和拦截器栈是在package中声明使用的,作用域仅在当前声明的package中,对于一些验证、异常相关的拦截器,需要在全局、也就是所有的package中都能使用,这种需要定义一个全局的package,使相应的action对应的package继承自该全局package即可。如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 设置struts是否为开发模式,默认为false,测试阶段一般设为true. -->
<constant name="struts.devMode" value="true"/>
<!--全局的package-->
<package name="commominterceptor" extends="struts-default">
<interceptors>
<interceptor name="myinterceptor"
class="com.owlforest.home.interceptor.MyInterceptor" />
<interceptor name="secinterceptor"
class="com.owlforest.home.interceptor.SecInterceptor" />
<interceptor-stack name="myinterceptorstack">
<interceptor-ref name="myinterceptor" />
<interceptor-ref name="secinterceptor" />
</interceptor-stack>
</interceptors>
</package>
<!--继承自commominterceptor的package-->
<package name="suibian" extends="commominterceptor">
<action name="hello" class="com.owlforest.home.action.HelloWorldAction"
method="excute">
<interceptor-ref name="myinterceptorstack"/>
<interceptor-ref name="params"/>
<result name="success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
拦截器栈与全局拦截器的运行效果如下:

Struts2学习:interceptor(拦截器)的使用的更多相关文章
- 模仿Struts2的Interceptor拦截器实现
模仿Struts2的Interceptor拦截器实现 public interface Invocation { public Object invoke(); } public interface ...
- struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo
理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...
- struts2学习(5)拦截器简介以及例子执行过程
一.拦截器简介: 二.Struts2预定义拦截器&拦截器栈 在执行action之前和之后,拦截器进行了操作: 比如struts-default.xml中就有很多预定义的拦截器: 拦截器栈: ...
- Struts2学习之拦截器
© 版权声明:本文为博主原创文章,转载请注明出处 拦截器: - Struts2大多数核心功能都是通过拦截器实现的,每个拦截器完成某项功能 - 拦截器方法在Action执行之前或之后执行 工作原理: - ...
- struts2自定义Interceptor拦截器
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- Struts2学习之拦截器栈
© 版权声明:本文为博主原创文章,转载请注明出处 拦截器栈: - 从结构上看:拦截器栈相当于多个拦截器的组合 - 从功能上看:拦截器栈也是拦截器 默认拦截器栈: - 在struts-core.jar中 ...
- Struts2基础学习(五)—拦截器
一.概述 1.初识拦截器 Interceptor 拦截器类似前面学过的过滤器,是可以在action执行前后执行的代码,是我们做Web开发经常用到的技术.比如:权限控制.日志等.我们也可以将多 ...
- 1.5(Spring MVC学习笔记) 拦截器(Interceptor)
一.拦截器 1.1拦截器简介 Spring中的拦截器类似Servlet中的过滤器(Filter),主要用于拦截用户请求, 并进行一定的处理操作(如验证权限.记录日志.设置编码方式等). 1.2拦截器实 ...
- 5.Struts2中的拦截器
拦截器是Struts2中的核心,其自带很多很多的拦截器,这里主要介绍一下自定义拦截器,恩多一半情况下呢?我们不需要使用到自定义的拦截器,Struts2本身已经提 供了很多的拦截器供我们使用,对于自定义 ...
- SpringMVC中使用Interceptor拦截器
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...
随机推荐
- roadhog 知识点
roadhog 是一个 cli 工具,提供 server. build 和 test 三个命令,分别用于本地调试和构建,并且提供了特别易用的 mock 功能.命令行体验和 create-react-a ...
- docker 容器的使用
本文使用centos7 1 ,docker 安装: yum install docker; 2 启动 docker: service docker start; 3 开机启动docker: chkc ...
- Ansible 常用模块之ping(四)
一.ping 模块 1.用途: 测试主机之间的连通性: 2.关键字:ping 3.参数:无 4.用法: ansible all -m ping 命令简单,测试所有服务器是否与控制机网络连通:
- Java模板引擎之Freemarker
Freemarker定义: 一款模板引擎 Freemarker是一个web图层组件不是web框架,解析服务端数据到页面 小例子: <#list 集合 as item> list标签对集合进 ...
- CENTOS 7 64BIT,MYSQL5.7安装与配置
配置MYSQL YUM源 wget -P ./ http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm ######## ...
- golang语言并发与并行——goroutine和channel的详细理解(一) 转发自https://blog.csdn.net/skh2015java/article/details/60330785
如果不是我对真正并行的线程的追求,就不会认识到Go有多么的迷人. Go语言从语言层面上就支持了并发,这与其他语言大不一样,不像以前我们要用Thread库 来新建线程,还要用线程安全的队列库来共享数据. ...
- web环境中微信JS-SDK配置
一.公众号相关设置 首先,在公众号中进行JS安全域名的设置,在公众号设置-功能设置中选择JS接口安全域名,点击设置进入设置对话框.按照要求逐步进行,完成设置. 二.页面请求发送与处理 引入所需js: ...
- mysql查询优化之四:优化特定类型的查询
本文将介绍如何优化特定类型的查询. 1.优化count()查询count()聚合函数,以及如何优化使用了该函数的查询,很可能是mysql中最容易被误解的前10个话题之一 count() 是一个特殊的函 ...
- Web jsp开发学习——前端后台传参方法
一.前端传后台: 1.1表单数据的传递 前端的表单里定义名字name 后台通过名字获取输入的值 1.2页面点击了哪个按钮传递 登录注销的另一种方式 点击登录的地方设置参数 ...
- 计时器setTimeout()
setTimeout()计时器,在载入后延迟指定时间后,去执行一次表达式,仅执行一次. 语法: setTimeout(代码,延迟时间); 参数说明: 1. 要调用的函数或要执行的代码串. 2. 延时时 ...