@(Java ThirdParty)[Struts|Interceptor]

Struts2 拦截器配置以及实现

Struts2的拦截器应用于Action,可以在执行Action的方法之前,之后或者两者。用于处理一些公共的方法,而不影响原有的代码,并且使得可以关注功能的实现,分离关注点。比如防止重复提交等。

如下图(图片来自Struts2文档Interceptor章节):

拦截器配置

注:以下配置均来自于Struts2官方的例子

Struts2内置了一些拦截器,也可以通过实现Interceptor接口来自定义拦截器。


如下,在struts.xml中配置自定义拦截器以及引用定义的拦截器:

<package name="default" extends="struts-default">
<interceptors>
<interceptor name="timer" class=".."/>
</interceptors> <action name="login"
class="tutorial.Login">
<interceptor-ref name="timer"/>
<result name="input">login.jsp</result>
</action>
</package>

如果定义多个拦截器,像上面那样一个个引用显然是很费劲的,这里可以将多个打包为一个拦截器栈,直接引用该拦截器栈即可:

<package name="default" extends="struts-default">
<interceptors>
<interceptor name="timer" class=".."/>
<interceptor name="logger" class=".."/>
<interceptor-stack name="myStack">
<interceptor-ref name="timer"/>
<interceptor-ref name="logger"/>
</interceptor-stack>
</interceptors> <action name="login"
class="tutuorial.Login">
<interceptor-ref name="myStack"/>
<result name="input">login.jsp</result>
</action>
</package>

Struts2 拦截器实现

在先介绍Struts2拦截器实现时,需要先介绍一个设计模式,拦截过滤器,Struts2采用了该设计模式来实现,文档中注解了说明是使用Command设计模式,但是我觉得用Intercepting filter来理解比较好理解。

Intercepting filter pattern

在wiki中Intercepting Filter定义为:JavaEE设计模式,用于创建可插拔式过滤器,用于处理通用的服务,而不需要改变和兴请求的处理代码。这涉及了四个组件:Filter Manager,Filter chain,Filters,Target。如下:

在下图,可以看成FilterManager维护着一系列的Filter,并且知道Target,这里可以实现为:FilterManager内部维护一个List<Filter>,该List作为Filter Chain。

注:图片来自Wiki

处理流程如下:

注:图片来自Wiki

Struts2 拦截器实现

Struts2中DefaultActionInvocation可以看做一个FilterManager,其中有Iterator<InterceptorMapping>,可以看做FilterChain,即包含了所有需要拦截该Action的Interceptor,其中Object action为真正的Target。如下图:

Interceptor接口:

public interface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}

主要执行流程在DefaultActionInvocation.invoke方法中,该方法用递归来实现链式调用(和Tomcat中实现FIlter一样):

public String invoke() throws Exception {
// 省略了部分代码... // 如果还有Interceptor,则继续(递归条件)
if (interceptors.hasNext()) {
try {
// 获取拦截器,并将当前对象传递给拦截器,由拦截器决定是要需要继续执行,例如:invocation.invoke(),如果执行了,则继续递归,直到执行完所有的拦截器,如果没有调用该方法,即拦截了,则这里就终止递归了。
resultCode = interceptor.getInterceptor().intercept(DefaultActionInvocation.this);
}
finally {
UtilTimerStack.pop(interceptorMsg);
}
} else {
// 只有执行完所有拦截器,才执行Action的方法
resultCode = invokeActionOnly();
} }

Tomcat Filter实现

Tomcat中Filter的实现和上面差不多,不过其中的类名和概念的名称比较匹配。如下:

ApplicationDispatcher通过使用FilterChain来实现Filter链式调用。

其中ApplicationFIlterChain.internalDoFilter为核心的代码:

private void internalDoFilter(ServletRequest request,
ServletResponse response)
throws IOException, ServletException { // 通过pos来记录当前执行的Filter,只有到所有Filter执行完(递归终止条件之一)
if (pos < n) {
ApplicationFilterConfig filterConfig = filters[pos++];
Filter filter = null;
try {
filter = filterConfig.getFilter(); if (request.isAsyncSupported() && "false".equalsIgnoreCase(
filterConfig.getFilterDef().getAsyncSupported())) {
// ... } else {
// Filter.doFilter,通过传入当前对象,来实现递归调用,将控制权传递给Filter,由Filter来决定是否需要继续执行下去
filter.doFilter(request, response, this);
} return;
} try { if ((request instanceof HttpServletRequest) &&
(response instanceof HttpServletResponse)) { if( Globals.IS_SECURITY_ENABLED ) {
// ...
} else {
// 执行Target真正的方法
servlet.service(request, response);
}
} else {
servlet.service(request, response);
}
}
// ...
}

参考文档:

Wiki:

https://en.wikipedia.org/wiki/Intercepting_filter_pattern

https://en.wikipedia.org/wiki/Interceptor_pattern

官方文档:

http://struts.apache.org/docs/interceptors.html

Struts2 拦截器配置以及实现的更多相关文章

  1. Struts2拦截器配置

    1. 理解拦截器 1.1. 什么是拦截器: 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.拦截是AO ...

  2. Struts2拦截器配置实例

    拦截器介绍 拦截器 的使用 ,源自Spring AOP(面向切面编程)思想 拦截器 采用 责任链 模式 * 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链. * 责任链每一个节 ...

  3. struts2 拦截器配置

    CheckLoginInterceptor.java---拦截器具体实现类: package com.sunhoo.hcpms.struts2.action.interceptors; import  ...

  4. 转载 - Struts2拦截器配置

    出处:http://blog.csdn.net/axin66ok/article/details/7321430 目录(?)[-] 理解拦截器 1 什么是拦截器 2 拦截器的实现原理 拦截器的配置 使 ...

  5. struts2拦截器配置;拦截器栈;配置默认拦截器;拦截方法的拦截器MethodFilterInterceptor;完成登录验证

    struts2.xml 内容 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...

  6. Struts2拦截器配置和使用

    拦截器是Struts2最强大的特性之一,它是一种可以让用户在Action执行之前和Result执行之后进行一些功能处理的机制. 说到拦截器interceptor,就会想到过滤器filter: 过滤器f ...

  7. Struts2 拦截器配置及使用

    在我的项目中有个需求,实现记录用户操作的系统日志,基于这个功能我首先想到的是Struts 的拦截器.配置一个全部Action都会拦截的拦截,写一个公用的服务.每当用户发送请求到Action 就记录相应 ...

  8. struts2拦截器interceptor的三种配置方法

    1.struts2拦截器interceptor的三种配置方法 方法1. 普通配置法 <struts> <package name="struts2" extend ...

  9. struts2拦截器interceptor的配置方法及使用

    转: struts2拦截器interceptor的配置方法及使用 (2015-11-09 10:22:28) 转载▼ 标签: it 365 分类: Struts2  NormalText Code  ...

随机推荐

  1. (六)Spark-Eclipse开发环境WordCount-Java&Python版Spark

    Spark-Eclipse开发环境WordCount 视频教程: 1.优酷 2.YouTube 安装eclipse 解压eclipse-jee-mars-2-win32-x86_64.zip Java ...

  2. sipex3232上电发送输入端拉低问题

    之前没怎么注意,在使用下载盒通过isp下载stm32时,由于是通过stm32板子给下载盒供电,所以是我的stm32板子和下载盒同时上电.这样总是不能够进入下载模式,后来对下载盒进行仿真,发现在下载发送 ...

  3. mongo 查询总结

    db.users.find() select * from users db.users.find({"age" : 27}) select * from users where ...

  4. USACO . Your Ride Is Here

    Your Ride Is Here It is a well-known fact that behind every good comet is a UFO. These UFOs often co ...

  5. hdu4059 The Boss on Mars(差分+容斥原理)

    题意: 求小于n (1 ≤ n ≤ 10^8)的数中,与n互质的数的四次方和. 知识点: 差分: 一阶差分: 设  则    为一阶差分. 二阶差分: n阶差分:     且可推出    性质: 1. ...

  6. Quartz实现任务调度

    一.任务调度概述 在企业级应用中,经常会制定一些"计划任务",即在某个时间点做某件事情,核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作,任务调度涉及多线程并发. ...

  7. WinForm TreeView递归加载

    这个其实通俗一点讲就是的树状分支图 首先利用递归添加数据 数据放入 treeView1.Nodes.Add() 中 public Form3() { InitializeComponent(); Tr ...

  8. Linux线程基础

    复习中掌握线程的基本管理即可,而不用考虑线程的同步: 创建线程花费的代价,比创建进程小得多,所以同一个进程的,多个线程执行多个任务-->比多个进程执行多个任务更有效率. 线程也分为用户级线程.内 ...

  9. 极路由2(极贰)ROOT并刷了OpenWrt

    绕过官方的ROOT 查了一下root教程, 如果还需要保留保修, 则需要自己想办法回退版本, 下载搜狐插件到sd卡, 找个linux系统修改sd卡上程序的执行权限, 然后才能开启ssh, 具体的方法可 ...

  10. [LeetCode] Longest Substring Without Repeating Characters 最长无重复子串

    Given a string, find the length of the longest substring without repeating characters. For example, ...