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
  • 相关阅读:
    [译文] 实体与值对象到底是不是一回事?
    实现 WebApi 自托管服务宿主于 WinForms 及其交互
    [译文] C# 8 已成旧闻, 向前, 抵达 C# 9!
    [译文] 为什么你在 C# 里总是应该使用 "var" 关键字
    通过设置iis在局域网中访问网页
    windows 10 安装使用kafka
    ASP.NET Core 2.1 中的 HttpClientFactory (Part 4) 整合Polly实现瞬时故障处理
    ASP.NET Core 2.1 中的 HttpClientFactory (Part 3) 使用Handler实现传出请求中间件
    ASP.NET Core 2.1 中的 HttpClientFactory (Part 2) 定义命名化和类型化的客户端
    Asp.net Core 2.0 OpenId Connect Handler缺失Claims?
  • 原文地址:https://www.cnblogs.com/pecool/p/8426673.html
Copyright © 2011-2022 走看看