zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Java 反射
    类中静态/普通/构造初始化顺序
    计算机世界中的0和1
    Java并发练习
    HashMap底层
    HashMap 与 Hashtable 的区别
    为什么重写了equals() 就要重写hashcode()
    干货型up主
    JSP页面元素
    重定向与请求转发的区别
  • 原文地址:https://www.cnblogs.com/pecool/p/8426673.html
Copyright © 2011-2022 走看看