struts2拦截器的使用与配置

拦截器和过滤器是类似的东西,它们的实现原理相同,但是却不是同一种东西,过滤器是web容器层面的,而拦截器是像struts2这样的控制器层面的。struts2本身就通过拦截器进行了诸如:参数注入,类型转换,…
当然我们也可以自定义拦截器,方法如下:

  1. 继承AbstractInterceptor,重写intercept方法
  2. 在struts的配置文件中配置拦截器

1.继承AbstractInterceptor,重写intercept方法

这里模拟了一个登陆验证的拦截器:通过判断session里面是否有userName这个属性检验用户是否登录过,来限制未登录用户非法访问系统页面。 ``` package com.lyu.struts.sysmanage.interceptor;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class LoginInterceptor extends AbstractInterceptor {

private static final long serialVersionUID = 5774470426465392583L;

// 重写intercept方法,拦截器和action业务控制类一样,也是返回一个视图名,在配置文件中用result配置即可,后面详解
@Override
public String intercept(ActionInvocation invocation) throws Exception {
	System.out.println("进入登录验证的拦截器");
	String returnCode = "";
	if (ServletActionContext.getRequest().getSession().
			getAttribute("userName") != null) {
		// 继续执行拦截器链里的下一个拦截器
		returnCode = invocation.invoke();
	} else {
		returnCode = "index";
	}
	System.out.println("退出了登录验证的拦截器");
	return returnCode;
}

}


<h3>2.在struts的配置文件中配置拦截器</h3>

 1). 自定义一个包用来放置已经写好的拦截器,继承struts-default包,将abstract设置为true,里面不能放action,放了也没用,抽象类不能实例化,适合放拦截器。

	<interceptor-stack name="mydefaultStack">
		<interceptor-ref name="loginInterceptor" />
		<interceptor-ref name="defaultStack" />
	</interceptor-stack>
</interceptors>
<!-- 默认使用的拦截器 -->
<default-interceptor-ref name="mydefaultStack" />
<!-- 如果拦截器找不到结果集,就会到全局的结果集中查找视图名 -->
<global-results>
	<!-- 既能重定向到某个请求也能重定向到某个页面 -->
	<result name="index" type="redirect">/index</result>
	<!-- 在当前路径的基础上,重定向到某个请求(在视图名后追加".action"),而不是重定向到某个页面 -->
	<!-- <result name="index" type="redirectAction">login</result> -->
</global-results>
``` 2). 用interceptor标签配置拦截器,name随便起(语义化),class为你写好的拦截器的全限定性类名;interceptor-stack是拦截器栈(就是一组拦截器,这里因为还要实现参数注入,类型转换等功能所以还要引用struts2默认的拦截器栈defaultStack--详见struts2源码)。 ```
<interceptor-stack name="mydefaultStack">
	<interceptor-ref name="loginInterceptor" />
	<interceptor-ref name="defaultStack" />
</interceptor-stack>
``` 3).配置一个默认的拦截器引用(可以是单个拦截器,也可以是拦截器栈),这样只要继承了该包就默认启用这个默认配置的拦截器,当然也可以在某个具体的action里面配置interceptor-ref。 ``` ``` 像这样: ``` /WEB-INF/views/sysmanage/delUser_suc.jsp ``` 4).拦截器也要返回视图名,所以还要在相应的action里面配置result,像这样: ``` /main.jsp /WEB-INF/views/sysmanage/delUser_suc.jsp ``` 当然也可以像配置默认拦截器引用一样,配置一个全局的返回结果:
<!-- 如果拦截器找不到结果集,就会到全局的结果集中查找视图名 -->
<global-results>
    	<!-- 既能重定向到某个请求也能重定向到某个页面 -->
    	<result name="index" type="redirect">/index</result>
    	<!-- 在当前路径的基础上,重定向到某个请求(在视图名后追加".action"),而不是重定向到某个页面 -->
    	<!-- <result name="index" type="redirectAction">login</result> -->
</global-results>

至此拦截器已经配置完毕,哪个包需要使用拦截器,继承刚才配置的拦截器包就可以了。

关于redirect和redirectAction的区别:redirect既能重定向到某个请求,也能重定向到某个具体的页面;而redirectAction只能重定向到某个请求,struts2会通过在视图名后面加“.action”的方式来实现,所以如果想使用这个方式,就不要在视图名后加“.action”,另外通过redirectAction方式进行的重定向只能在当前namespace的基础上进行,例如:当前包的namespace为“/sysmange”,redirectAction的视图名为“/index”,则重定向的请求为“/sysmanage//index.action”而不是“/index”,这里需要注意下。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值