struts2--实现自定义拦截器

前言:

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

目录:

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

Best Regards
原文地址:https://www.cnblogs.com/pecool/p/8426673.html