Struts2的应用:自定制Interceptor拦截器

Struts拦截器

使用过Struts2的开发人员都知道,Struts2的Action之所以如此强大(比如请求参数能够自动完成类型转换,并且填充到Action中的属性;Action中属性的一些验证),是因为在这个Action被调用之前(具体可以理解为Action.execute方法执行之前),有系列的拦截器为我们完成了很多任务。Struts2内置提供了10多种拦截器,常见的有Parameter拦截器、Validation拦截器和File Upload拦截器。虽然这些内置的拦截器可以满足我们绝大部分的项目需求,但是,需求是多变的,我们总会遇到我们要编写自定制拦截器来完成某个任务,下面讲讲怎么在Struts2中自定制拦截器,并附上具体的案例。

Struts拦截器的定制

Struts拦截器的定制需要我们自己的Struts拦截器实现Interceptor接口,Interceptor接口原型如下:

public interface Interceptor
{
  void init();
  void destroy();
  String intercept(ActionInvocation invocation) throws Exception;
}
一个Interceptor的实现类,可能会拥有一些资源,比如说文件、链接等等。

init方法:负责初始化资源

destroy方法:在对象销毁之前调用,负责销毁占用的资源

intercept方法:完成一些具体的任务


参数ActionInvocation:这个参数主要包含了两个对象,被调动的Action实例和一个Result实例。


并不是所有的Interceptor实现都会拥有资源的,如果每次都要我们去实现init方法和destroy方法,也是很令人厌烦的,所以Struts2为我们提供了AbstractInterceptor抽象类,这个类的原型如下:

public abstract class AbstractInterceptor
{
  public void init()  {}
  public void destroy()  {}
  public abstract String intercept(ActionInvocation) throws Exception;
}
继承这个类,我们只需要实现intercept方法,就省事了。

一个自己定制的intercor,应该如下:

public class MyInterceptor extends AbstractInterceptor
{
  //code declear your resource here...
  //code getter and setter here..
  public void init()
  {
    //code initial  your resource here...
  }
  public void destroy()
  {
    //code  release your resource here...
  }
  public String intercept(ActionInvocation invocation)
  {
    //code fufil your task
   return invocation.invoke();
  }
}
需要注意的是,invocation.invoke()方法的调用会把当前ActionInvocation对象交给下一个Interceptor实例处理。

Struts拦截器的注册

拦截器定义好了,还需要在struts.xm文件进行注册,我们需要在包下即package元素下去注册拦截器

<package name="somepackage" namespace="/" extends="struts-default">
  <interceptor name="my" class="com.daniel.interceptor.MyInterceptor"/>
</package>
一般对于name的命名是,如果你的类是xxxInterceptor,那么name命名就取用xxx

在interceptor元素下,可以配置param子元素,该子元素的属性有name,这个子元素可以将值注入到Interceptor的属性当中。

Struts拦截器实例

以下实例是通过拦截器为一个Action注入属性值。

拦截器MsgInjectionInterceptor

@SuppressWarnings("serial")
public class MsgInjectionInterceptor extends AbstractInterceptor {

	/**
	 * 拦截器属性,通过<param>可以为拦截器属性注入值
	 */
	private String msg;

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	@Override
	public String intercept(ActionInvocation arg0) throws Exception {
		// TODO Auto-generated method stub
		Action action = (Action) arg0.getAction();
		try
		{
			MsgAction msgAction = (MsgAction) action;
			msgAction.setMsg(msg);
		}
		catch(ClassCastException e)
		{
			e.printStackTrace();
		}
		return arg0.invoke();
	}
}
Action类

@SuppressWarnings("serial")
public class MsgAction extends ActionSupport {

	private String msg;

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		System.out.println(msg);
		return super.execute();
	}
	
	
}
配置struts.xml

	<package name="action" namespace="/" extends="struts-default">
		<interceptors>
			<interceptor name="msgInjection" class="com.daniel.struts.interceptors.MsgInjectionInterceptor">
				<param name="msg">hello</param>
			</interceptor>
			<interceptor name="appendMsg" class="com.daniel.struts.interceptors.AppendMsgInterceptor"></interceptor>
		</interceptors>
		
		<action name="MsgAction" class="com.daniel.struts.action.MsgAction">
			<interceptor-ref name="msgInjection"></interceptor-ref>
			<interceptor-ref name="appendMsg"></interceptor-ref>
			<interceptor-ref name="basicStack"></interceptor-ref>
			<result>/index.jsp</result>
		</action>
	</package>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Struts2 中,可以使用拦截器来实现权限控制。具体来说,可以编写一个自定义的拦截器,然后在 struts.xml 配置文件中将其配置为需要进行权限控制的 Action拦截器。以下是一个简单的权限拦截器示例: ```java public class AuthInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { // 获取当前用户 User user = (User) ActionContext.getContext().getSession().get("user"); // 判断用户是否拥有权限 if (user != null && user.hasPermission(invocation.getInvocationContext().getName())) { // 如果有权限,则继续执行 Action return invocation.invoke(); } else { // 如果没有权限,则跳转到错误页面 return "error"; } } } ``` 在上述代码中,我们首先获取了当前用户,然后判断用户是否拥有执行当前 Action 的权限。如果有权限,则继续执行 Action;否则,跳转到错误页面。 接下来,在 struts.xml 配置文件中,我们可以将该拦截器配置为需要进行权限控制的 Action拦截器,如下所示: ```xml <action name="myAction" class="com.example.MyAction"> <interceptor-ref name="authInterceptor"/> <result name="success">/myAction.jsp</result> <result name="error">/error.jsp</result> </action> <interceptor-stack name="authStack"> <interceptor-ref name="authInterceptor"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> <interceptors> <interceptor name="authInterceptor" class="com.example.AuthInterceptor"/> </interceptors> ``` 在上述代码中,我们首先定义了一个名为 authStack 的拦截器栈,该拦截器栈包含了 authInterceptor 和 defaultStack 两个拦截器。然后,我们将 myAction Action 配置为使用 authStack 拦截器栈。最后,我们定义了一个名为 authInterceptor拦截器,并将其添加到了 interceptors 中。 这样一来,当用户访问 myAction Action 时,就会先执行 authInterceptor 拦截器,进行权限控制,然后再执行 defaultStack 拦截器栈中的其它拦截器。如果 authInterceptor 拦截器返回了 error,则会跳转到 error.jsp 页面;否则,会跳转到 myAction.jsp 页面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值