Struct2拦截器的原理与实现

  一、理解Struts2拦截器

  1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.

  2. 拦截器栈(Interceptor Stack)。Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。

  二、实现Struts2拦截器原理

  Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的 拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器

  三、定义Struts2拦截器。

  Struts2规定用户自定义拦截器必须实现com.opensymphony.xwork2.interceptor.Interceptor接口。该接口声明了3个方法,

  void init(); void destroy(); String intercept(ActionInvocation invocation) throws Exception;

  复制代码

  其中,init和destroy方法会在程序开始和结束时各执行一遍,不管使用了该拦截器与否,只要在struts.xml中声明了该Struts2拦截器就会被执行。

  intercept方法就是拦截的主体了,每次拦截器生效时都会执行其中的逻辑。

  不过,struts中又提供了几个抽象类来简化这一步骤。

  public abstract class AbstractInterceptor implements Interceptor;

  复制代码

  其中AbstractInterceptor提供了init()和destroy()的空实现,使用时只需要覆盖intercept()方法;

  而MethodFilterInterceptor则提供了includeMethods和excludeMethods两个属性,用来过滤执行该过滤器的action的方法。可以通过param来加入或者排除需要过滤的方法。

  来个例子:自定义的Interceptor继承MethodFilterInterceptor

  package com.ifs.Interceptor;

  import java.util.Map;

  import com.ifs.entity.Admin;

  import com.opensymphony.xwork2.ActionInvocation;

  import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

  public class SecurityInterceptor extends MethodFilterInterceptor{

  /**

  *

  */

  private static final long serialVersionUID = 1L;

  public void init() {

  super.init();

  }

  @Override

  public void destroy() {

  super.destroy();

  }

  @Override

  protected String doIntercept(ActionInvocation invocation) throws Exception {

  Map sessions = invocation.getInvocationContext().getSession();

  Admin admin =(Admin)sessions.get("adminLogin");

  if(admin!= null){

  String result = invocation.invoke();

  return result;

  }else{

  return "suok";

  }

  }

  }

  复制代码

  struts.xml

  action调用:

  login

  复制代码

  拦截器

  名字

  说明

  Alias Interceptor

  alias

  在不同请求之间将请求参数在不同名字件转换,请求内容不变

  Chaining Interceptor

  chain

  让前一个Action的属性可以被后一个Action访问,现在和chain类型的result()结合使用。

  Checkbox Interceptor

  checkbox

  添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。

  Cookies Interceptor

  cookies

  使用配置的name,value来是指cookies

  Conversion Error Interceptor

  conversionError

  将错误从ActionContext中添加到Action的属性字段中。

  Create Session Interceptor

  createSession

  自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。

  Debugging Interceptor

  debugging

  提供不同的调试用的页面来展现内部的数据状况。

  Execute and Wait Interceptor

  execAndWait

  在后台执行Action,同时将用户带到一个中间的等待页面。

  Exception Interceptor

  exception

  将异常定位到一个画面

  File Upload Interceptor

  fileUpload

  提供文件上传功能

  I18n Interceptor

  i18n

  记录用户选择的locale

  Logger Interceptor

  logger

  输出Action的名字

  Message Store Interceptor

  store

  存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。

  Model Driven Interceptor

  model-driven

  如果一个类实现了ModelDriven,将getModel得到的结果放在Value Stack中。

  Scoped Model Driven

  scoped-model-driven

  如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。

  Parameters Interceptor

  params

  将请求中的参数设置到Action中去。

  Prepare Interceptor

  prepare

  如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。

  Scope Interceptor

  scope

  将Action状态存入session和application的简单方法。

  Servlet Config Interceptor

  servletConfig

  提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。

  Static Parameters Interceptor

  staticParams

  从struts.xml文件中将中的中的内容设置到对应的Action中。

  Roles Interceptor

  roles

  确定用户是否具有JAAS指定的Role,否则不予执行。

  Timer Interceptor

  timer

  输出Action执行的时间

  Token Interceptor

  token

  通过Token来避免双击

  Token Session Interceptor

  tokenSession

  和Token Interceptor一样,不过双击的时候把请求的数据存储在Session中

  Validation Interceptor

  validation

  使用action-validation.xml文件中定义的内容校验提交的数据。

  Workflow Interceptor

  workflow

  调用Action的validate方法,一旦有错误返回,重新定位到INPUT画面

  Parameter Filter Interceptor

  N/A

  从参数列表中删除不必要的参数

  Profiling Interceptor

  profiling

  通过参数激活profile

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值