回忆
在上一篇SSH学习之Struts2中的校验中已经学习了Struts2框架提供的两种后台校验数据的方式,接下来想要介绍的也是和这些有些关系的内容——拦截器。
拦截器这个概念只是Struts框架中的概念,其他的并没有这个概念。如果学过过滤器这个概念的话,理解这个就会很方便。拦截器的理解和过滤器的作用也是相似的。
拦截器概述
Struts2是一个开源框架,封装了很多常用的功能,比如属性封装、模型驱动、数据校验、文件上传等等。但是这些功能的实现一般是包含拦截器中的。所以说,Struts2有很多默认的拦截器。
拦截器和过滤器的区别
过滤器理论上可以拦截任意内容,比如jsp、html、图片等。
拦截器只拦截Action的请求。
拦截器的执行时间
拦截器的执行时间是action对象创建之后,方法执行之前。(这个和验证相似)
自定拦截器
在Struts2框架中已经封装好了基本的一些功能,但是在实际开发中项目的需求不仅仅只需要默认的拦截器,还需要一些自己定义某些功能的拦截器,比如用户权限访问等。
自定义的拦截器常用的有两种方式:实现Interceptor接口和继承了实现Interceptor接口的实现类。
实现Interceptor接口
package interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class UserInterceptor implements Interceptor {
@Override
public void destroy() {
}
@Override
public void init() {
}
@Override
public String intercept(ActionInvocation arg0) throws Exception {
//拦截功能主要在这个方法中写,比如判断用户是否已经登录
return null;
}
}
继承Interceptor接口的实现类
比较常用的是MethodFilterInterceptor实现类,因为该方法可以指定action中应该拦截和不应该拦截的方法。
package interceptor;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class User2Interceptor extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation arg0) throws Exception {
Object obj = ServletActionContext.getRequest().getSession().getAttribute("user");
if(obj != null) {
return arg0.invoke();
}
return "notLogin";
}
}
arg0.invoke()方法其实就是放行,继续执行下一个拦截器。
配置自定义拦截器
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="yxd" extends="struts-default" namespace="/">
<!-- 1.在package标签声明自定义拦截器 -->
<interceptors>
<interceptor name="loginInterceptor" class="com.yxd.interceptor.LoginInterceptor"></interceptor>
</interceptors>
<action name="user_*" class="com.yxd.action.UserAction" method="{1}">
<!-- 2.在action标签使用自定义拦截器 -->
<interceptor-ref name="loginInterceptor">
<!-- name值是固定的,表示不对该方法进行拦截
标签值是方法名
-->
<param name="excludeMethods">login</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="add" type="redirect">/add.jsp</result>
<result name="update" type="redirectAction">user_add</result>
<result name="loginSuccess" type="dispatcher">/loginSuccess.jsp</result>
<result name="login" type="dispatcher">/login.jsp</result>
</action>
</package>
</struts>
关于拦截器的配置除了以上的方法外还可以这样。重新设置默认的拦截器栈。
<interceptors>
<interceptor name="loginInterceptor" class="com.lab.interceptor.admin.AdminLoginIntercept">
<param name="excludeMethods">loginPage,login</param>
</interceptor>
<interceptor-stack name="myDefault">
<interceptor-ref name="loginInterceptor" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myDefault" />
多余的话
这是我的一些理解了,请多多见谅