前言:strut2框架提供拦截器的实现有很多种,根据需求我们需要拦截登陆页面以后的操作,同时也要放行一些页面。而MethodFilterInterceptor 可以满足这一点,他有一个属性Set<String> excludeMethods 可以指定哪些方法不用拦截。
提供一个工具类方便获取session中的用户信息:
/**
* BOS项目的工具类
*/
public class DemoUtils {
//获取session对象
public static HttpSession getSession(){
return ServletActionContext.getRequest().getSession();
}
//获取登录用户对象
public static User getLoginUser(){
return (User) getSession().getAttribute("loginUser");
}
}
创建拦截类,继承MethodFilterInterceptor,实现用户未登录自动跳转登陆页面:
这里注意login是controller中定义的登陆方法名login();
/**
* 自定义的拦截器,实现用户未登录自动跳转到登录页面
*
*/
public class BOSLoginInterceptor extends MethodFilterInterceptor{
//拦截方法
protected String doIntercept(ActionInvocation invocation) throws Exception {
ActionProxy proxy = invocation.getProxy();
String actionName = proxy.getActionName();
String namespace = proxy.getNamespace();
String url = namespace + actionName;
System.out.println(url);
//从session中获取用户对象
User user = BOSUtils.getLoginUser();
if(user == null){
//没有登录,跳转到登录页面
return "login";
}
//放行
return invocation.invoke();
}
}
在struts.xml中配置拦截器:
<package name="basicstruts2" extends="struts-default">
<interceptors>
<!-- 注册自定义拦截器 -->
<interceptor name="bosLoginInterceptor" class="com.itheima.bos.web.interceptor.BOSLoginInterceptor">
<!-- 指定哪些方法不需要拦截 -->
<param name="excludeMethods">login</param>
</interceptor>
<!-- 定义拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="bosLoginInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"/>
<!-- 全局结果集定义 -->
<global-results>
<result name="login">/login.jsp</result>
</global-results>
<!-- 需要进行权限控制的页面访问 -->
<action name="page_*_*">
<result type="dispatcher">/WEB-INF/pages/{1}/{2}.jsp</result>
</action>
<!-- 用户管理 -->
<action name="userAction_*" class="userAction" method="{1}">
<result name="home">/index.jsp</result>
</action>