struts2拦截器的实现机制

前言:

    最近老大让每周写一篇技术性的博客,想想也没啥写,就想着随便拿个以前的项目去研究研究五大框架的底层代码。本人水平有限,有不对的地方还望大家勿喷,指正!

开始之前先了解下strtus2的工作流程:

 工作原理图:


(1) 客户端(Client)向Action发用一个请求(Request) 

(2) Container通过web.xml映射请求,并获得控制器(Controller)的名字 

(3) 容器(Container)调用控制器(StrutsPrepareAndExecuteFilter或FilterDispatcher)。在Struts2.1以前调用FilterDispatcher,Struts2.1以后调用StrutsPrepareAndExecuteFilter 

(4) 控制器(Controller)通过ActionMapper获得Action的信息 

(5) 控制器(Controller)调用ActionProxy 

(6) ActionProxy读取struts.xml文件获取action和interceptor stack的信息。 

(7) ActionProxy把request请求传递给ActionInvocation 

(8) ActionInvocation依次调用action和interceptor 

(9) 根据action的配置信息,产生result 

(10) Result信息返回给ActionInvocation 

(11) 产生一个HttpServletResponse响应 

(12) 产生的响应行为发送给客服端。

拦截器所涉及的接口和类:

用struts2实现拦截器有三种方式:

  1.实现Interceptor接口

```

    publicinterfaceInterceptor

extendsSerializable

//继承Serializable

{

publicabstractvoiddestroy();

publicabstractvoidinit();

//ActionInvocation 是一个接口

publicabstractStringintercept(ActionInvocationactioninvocation)

throwsException;

}

```

2.继承AbstractInterceptor类

    publicabstractclassAbstractInterceptor

implementsInterceptor

//并没有具体实现

{

publicAbstractInterceptor()

   {

   }

publicvoidinit()

   {

   }

publicvoiddestroy()

   {

   }

publicabstractStringintercept(ActionInvocationactioninvocation)

throwsException;

}

所以我们并不建议用上面那两种方法

继承MethodFilterInterceptor类

publicabstractclassMethodFilterInterceptorextendsAbstractInterceptor

{

publicMethodFilterInterceptor()

   {

log=LoggerFactory.getLogger(getClass());

excludeMethods=Collections.emptySet();

includeMethods=Collections.emptySet();

   }

publicvoidsetExcludeMethods(StringexcludeMethods)

   {

this.excludeMethods=TextParseUtil.commaDelimitedStringToSet(excludeMethods);

   }

publicSetgetExcludeMethodsSet()

   {

returnexcludeMethods;

   }

publicvoidsetIncludeMethods(StringincludeMethods)

   {

this.includeMethods=TextParseUtil.commaDelimitedStringToSet(includeMethods);

   }

publicSetgetIncludeMethodsSet()

   {

returnincludeMethods;

   }

publicStringintercept(ActionInvocationinvocation)

throwsException

   {

if(applyInterceptor(invocation))

returndoIntercept(invocation);

else

returninvocation.invoke();

   }

protectedbooleanapplyInterceptor(ActionInvocationinvocation)

   {

Stringmethod=invocation.getProxy().getMethod();

booleanapplyMethod=MethodFilterInterceptorUtil.applyMethod(excludeMethods,includeMethods,method);

if(log.isDebugEnabled()&&!applyMethod)

log.debug((newStringBuilder()).append("Skipping Interceptor... Method [").append(method).append("] found in exclude list.").toString(),newString[0]);

returnapplyMethod;

   }

protectedabstractStringdoIntercept(ActionInvocationactioninvocation)

throwsException;

protectedtransientLoggerlog;

//排除的方法集合

protectedSetexcludeMethods;

//包括的方法集合(就是要拦截的方法)

protectedSetincludeMethods;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、struts2工作流程 Struts 2框架本身大致可以分为3个部分: 核心控制器FilterDispatch...
    重山杨阅读 5,400评论 0 38
  • 在学习struts2之前,首先我们要明白使用struts2的目的是什么?它能给我们带来什么样的好处? 设计目标 S...
    有一个帅哥阅读 3,928评论 0 3
  • 姓名: 李小娜 [嵌牛导读]: SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,...
    n184阅读 8,374评论 0 4
  • 昨晚算是熬夜的把奇葩说的最新一期看完了,对于生活中的暴击,值不值得感激。当时看到辩题,想都没想,肯定原谅加感激阿。...
    费强_phial阅读 10,256评论 1 1
  • 从决定每天在简书写写画画也有十几天了,竟然扛了下来,尽管都是些狗屁,也算是个好的开始吧。筛子滤过沙子,难保不会留下...
    kwork1988阅读 1,111评论 0 0