拦截器应该算是struts2的核心了,struts2的这些东西都离不开拦截器,拦截器开发中用的地方其实不多,例如过滤器的功能还不能满足实际需要,拦截器或许是不同的选择,拦截器对资源的控制粒度要比过滤器要细一点,我觉得下面两种情况笔记适合使用过滤器
1.某些action不能被随意访问
2.过滤器不能满足的某些权限控制
例如项目要求只有登录后的用户才能调用某些action,但是用于登录的action没个人都能访问。这个要求或许过滤器能实现但是很容易出现循环重定向的情况,这种情形使用拦截器应该是较好的选择
1.编写拦截器
拦截器应继承AbstractInterceptor,如果没有继承这个类,程序会报错
package com.ssi.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class SessionInterceptor extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation arg0) throws Exception {
HttpServletRequest req = ServletActionContext.getRequest();
HttpSession session = req.getSession();
HttpServletResponse res = ServletActionContext.getResponse();
if (session.getAttribute("userInfo")!=null){
arg0.invoke();
} else {
res.sendRedirect("../index.jsp");
}
return null;
}
}
这个类和过滤器有点像,这里通过session判断用户是否登录,如果session不为空则程序继续执行,此时action里方法会执行,如果session为空则重定向到登录页面
2.配置自定义拦截器栈
<interceptors>
<interceptor name="loginJudge" class="com.ssi.interceptor.SessionInterceptor">/interceptor>
<!-- 自定义拦截器栈 -->
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="loginJudge"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 将自定义拦截器栈设置默认的拦截器 -->
<default-interceptor-ref name="myDefaultStack" />
3.完整的配置
<!-- 项目信息管理 -->
<package name="projectAction" namespace="/project" extends="struts-default">
<interceptors>
<interceptor name="loginJudge"
class="com.ssi.interceptor.SessionInterceptor">
</interceptor>
<!-- 自定义拦截器栈 -->
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="loginJudge"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 将自定义拦截器栈设置默认的拦截器 -->
<default-interceptor-ref name="myDefaultStack" />
<action name="projectAction" class="projectAction">
<result name="success">/manage/projects/ProjectList.jsp</result>
<result name="toEdit">/manage/projects/ProjectEdit.jsp</result>
<result name="getProjectForPersonal">/manage/projects/PersonalProjectList.jsp</result>
</action>
</package>
如果是涉及到登录的action,这些拦截器就不配置上去就行了
<package name="loginAction" namespace="/login" extends="struts-default">
<action name="loginAction" class="loginAction">
<result name="success">/manage/index.jsp</result>
<result name="logout">../index.jsp</result>
</action>
</package>
是不是足够的简单呢,如果没用过struts2的可以看下这篇文章: