zoukankan      html  css  js  c++  java
  • Struts2整理-----Struts2拦截器

    struts2的拦截器是struts2的核心,其底层实现使用了Java的反射机制与动态代理。

    实现struts2拦截器的方法

    1.实现Interceptor接口,实现init(),destory(),intercept()方法。

    2.继承AbstractInterceptor类,重写intercept()方法.

    3.继承MethodFilterInterceptor类,重写doIntercept()方法

    拦截器实现原理:

    当请求struts2的action时,strus2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截 

    拦截器和过滤器比较

    1、拦截器是基于java的反射机制的,而过滤器是基于函数回调

    2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器

    3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用

    4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能

    5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

    新建一个案例

    新建Action

    package com.aaron.action;
    
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    
    public class UserAction extends ActionSupport {
    
        private static final long serialVersionUID = 1L;
        private String name;
    
        // 用户登录
        public String login() {
            return SUCCESS;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    }

    写一个过滤器

    package com.aaron.action;
    
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.struts2.StrutsStatics;
    
    import com.opensymphony.xwork2.Action;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
    
    public class AuthorityInterceptor extends AbstractInterceptor {
        private static final long serialVersionUID = 1L;
        // 拦截Action处理的拦截方法
        public String intercept(ActionInvocation invocation) throws Exception {
            System.out.println("进入拦截器》》》》》》》");
            ActionContext ac=invocation.getInvocationContext();
            //struts2 拦截器Interceptor中取得request
            HttpServletRequest request=(HttpServletRequest) ac.get(StrutsStatics.HTTP_REQUEST);
            // 取出名为user的Session属性
            String name = request.getParameter("name");
            try{
                System.out.println("得到的用户名是:  "+name);
            }catch(Exception ex){
                System.out.println("异常: "+ex.toString());
            }
            // 如果没有登陆,或者登陆所用的用户名不是aaron,都返回重新登陆
            if (name != null && name.equals("aaron")) {
                request.getSession().setAttribute("msg", "登录成功");
                request.getSession().setAttribute("name", name);
                return invocation.invoke();
            }
            //ctx.put("msg", "没有权限,重新登录");
            request.getSession().setAttribute("msg", "没有权限,重新登录");
            
            // 直接返回login的逻辑视图
            return Action.LOGIN;
        }
    } 

    这里直接判断用户名是否符合要求。

    PS:struts2 拦截器Interceptor中取得request: HttpServletRequest request = (HttpServletRequest) ac.get(StrutsStatics.HTTP_REQUEST);


    配置struts.xml文件

    <?xml version="1.0"?>
                <!DOCTYPE struts PUBLIC 
     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
     "http://struts.apache.org/dtds/struts-2.0.dtd">
    <struts>
    
        <constant name="struts.i18n.reload" value="false" />
        <constant name="struts.devMode" value="false" />
    
        <package name="default" extends="struts-default" namespace="/">
            <!-- 用户拦截器定义在该元素下 -->
            <interceptors>
                <!-- 定义了一个名为checkUserLogin的拦截器 -->
                <interceptor name="checkUserLogin" class="com.aaron.action.AuthorityInterceptor" />
                <interceptor-stack name="checkUserLogin_stack">
                    <!-- 应用默认拦截器堆栈 一定要有 -->
                    <interceptor-ref name="defaultStack" />
                    <!-- 应用自定义拦截器 -->
                    <interceptor-ref name="checkUserLogin" />
                </interceptor-stack>
            </interceptors>
            <!-- 定义默认拦截器 -->
            <default-interceptor-ref name="checkUserLogin" />
            <!-- 定义全局处理结果 -->
            <global-results>
                <result name="login">login.jsp</result>
            </global-results>
            <action name="login" class="com.aaron.action.UserAction"
                method="login">
                <result name="success">success.jsp</result>
                <result name="login">login.jsp</result>
            </action>
    
        </package>
    
    </struts>

    测试

    除了aaron用户名可以登录,输入其他用户名显示的都是“没有权限,重新登录”。

  • 相关阅读:
    .net core读取appsettings.config中文乱码问题
    vs2017错误:当前页面的脚本发生错误
    VS Code中无法识别npm命令
    Visual Studio报错/plugin.vs.js,行:1074,错误:缺少标识符、字符串或数字
    记录一次在生成数据库服务器上出现The timeout period elapsed prior to completion of the operation or the server is not responding.和Exception has been thrown by the target of an invocation的解决办法
    Java集合框架
    java hash表
    Java Dictionary 类存储键值
    java数据结构 栈stack
    java封装
  • 原文地址:https://www.cnblogs.com/haaron/p/5123624.html
Copyright © 2011-2022 走看看