前言:
本篇文章,我想说清实现拦截器的办法,还有为什么要这样做:
目录:
1.需求目的
2.实现步骤及原理(文字怕描述不清,画图描述)
3.代码
4.总结
一、需求目的
规范或限制越级访问(例如:一个客户端,没有登录,直接发送了一个修改密码的action请求,或者直接退出系统,这些都可能造成bug,再或者直接访问一些资源文件)
二、实现步骤及原理(画图描述)
第一步:写自己的拦截器
第二步:配置struts.xml文件
三、代码
第一步:写自己的拦截器
package com.catit.tms.filter; import org.apache.struts2.ServletActionContext; import com.catit.tms.domain.User; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; /** * 拦截action * @author phoebe * */ public class MyActionFilter extends MethodFilterInterceptor{ private static final long serialVersionUID = 1L; @Override protected String doIntercept(ActionInvocation invocation) throws Exception { //获取用户是否登录 User user = (User) ServletActionContext.getRequest().getSession().getAttribute("activeUser"); if(user != null){ //已登录放行 return invocation.invoke(); } //未登录,跳转到登录页面使其登录 return "login"; } }
第二步:配置struts.xml文件
<?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> <!-- 开发者模式打开可以提高开发效率,关闭不容易出错: --> <constant name="struts.devMode" value="false" /> <package name="myStruts" extends="struts-default" namespace="/"> <!-- 拦截器设置 --> <interceptors> <!-- 自定义拦截器 --> <interceptor name="myActionFilter" class="com.catit.tms.filter.MyActionFilter"> <!-- 放行方法名为login的方法 --> <param name="excludeMethods">login</param> </interceptor> <!-- 自定义拦截器栈 --> <interceptor-stack name="selfStack"> <!-- 必须引用struts-default.xml中的拦截器栈 --> <interceptor-ref name="defaultStack"></interceptor-ref> <!-- 自己的拦截器 --> <interceptor-ref name="myActionFilter"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 配置全局拦截器为 --> <default-interceptor-ref name="selfStack"></default-interceptor-ref> <!-- 全局result --> <global-results> <result name="login">${pageContext.request.contextPath}/login.jsp</result> </global-results> <!-- 需要进行权限控制的页面访问 --> <action name="page_*_*"> <interceptor-ref name="selfStack"></interceptor-ref> <result type="dispatcher">/WEB-INF/pages/{1}/{2}.jsp</result> </action> <!-- 用户 --> <action name="user_*" class="userAction" method="{1}"> <result name="success" type="dispatcher">${pageContext.request.contextPath}/WEB-INF/pages/common/index.jsp</result> </action> </package> </struts>
四、总结
1、实现拦截器有很多方法,根据需求不同选择继承或者实现接口也不相同
2、includeMethods的优先级大于excludeMethods