struts2--实现自定义拦截器

时间:2024-08-03 17:04:50

前言:

  本篇文章,我想说清实现拦截器的办法,还有为什么要这样做:

目录:

1.需求目的

2.实现步骤及原理(文字怕描述不清,画图描述)

3.代码

4.总结

一、需求目的

  规范或限制越级访问(例如:一个客户端,没有登录,直接发送了一个修改密码的action请求,或者直接退出系统,这些都可能造成bug,再或者直接访问一些资源文件)

二、实现步骤及原理(画图描述)

  第一步:写自己的拦截器

  struts2--实现自定义拦截器

  第二步:配置struts.xml文件

  struts2--实现自定义拦截器

三、代码

  第一步:写自己的拦截器

  

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