• struts2 的自定义 拦截器


    Struts2的 拦截器:

    对于拦截器,Struts2官方给出的 定义是:

    拦截器是动态拦截Action调用的对象。它提供了一种机制,使开发者可以定义一段代码,在Action执行之前或者之后被调用执行,也可以在一个Action执行前阻止执行,同时也提供了一种可以提取Action中科重用部分的方式。

    通俗一点来说,拦截器是一个实现了一定功能的类,它以一种课插拔的方式(所谓可插拔就是指增加和减少某个功能的时候,不会影响到其他功能的实现),被定义在某个Action执行之前或者之后,用来完成特定的功能。

    添加了拦截器执后的执行流程图:

    它的设计机制就是:当为Action添加功能的时候就配置拦截器,当为Action减少功能的时候就取消配置拦截器

    通过这种方法,在Action所需要功能发生变化的时候,我们只要修改拦截器的配置就能轻松实现。

    这里是一个自定义拦截登陆的小案例:

    1.声明一个类实现Interceptor接口或者继承AbstractInterceptor类

     

    public class LoginInter implements Interceptor{
        
        public void destroy() {
            System.out.println("拦截器销毁");
        }
    
        public void init() {
            System.out.println("拦截器初始化");
        }
    
        public String intercept(ActionInvocation actionInvocation) throws Exception {
            Map<String, Object> session = ActionContext.getContext().getSession();
            String value = "";
            StringBuilder  stringBuilder = new StringBuilder("");
            stringBuilder.append(actionInvocation.getProxy().getNamespace());  //拿到 请求的actionname
            stringBuilder.append(actionInvocation.getProxy().getActionName()); //拿到请求的 namespace  路径
            String usernmae = (String) session.get("username");
            System.out.println(stringBuilder.toString()+"---------------------"+usernmae);
    
            if(stringBuilder.toString().equals("/interlogin")){
                value = actionInvocation.invoke();                  //放行
            }else if(usernmae!=null){
               
                value=actionInvocation.invoke();
    
            }else{
    
                value="login";
            }
    
            System.out.println(value+"------------------");
    
            return value;
        }
    }

    这里的意思是:首先判断访问的 url是否是interlogin 就是验证登陆的路径,其次判断登陆成功后的session是否为空,不为空说明已经登陆过了 放行,最后一种情况没有符合前两种情况就让用户重新登陆

    value 返回的是逻辑视图名 让value跟配置文件的action中的result去匹配,找到物理视图,返回给用户。

    配置文件配置信息:

     <!--自定义拦截器 模仿登陆拦截-->
        <package name="inter" namespace="/inter" extends="struts-default">
    
            <interceptors>
                <interceptor name="logininter" class="inter.LoginInter"></interceptor>   <!--指定自定义的拦截器-->
                <interceptor-stack name="loginStack">                                    <!--定义拦截器栈-->
                    <interceptor-ref name="defaultStack"></interceptor-ref>
                    <interceptor-ref name="logininter"></interceptor-ref>
                </interceptor-stack>
            </interceptors>
    
            <global-results>
                <result name="login">/jsp/login.jsp</result>                            <!--定义全局路径-->
            </global-results>
    
            <action name="login" class="action.TestInterAction">                        <!--登陆action-->
                   <result name="success">/jsp/welcome.jsp</result>
                    <interceptor-ref name="loginStack"></interceptor-ref>
            </action>
    
            <action name="book" class="action.TestBookAction" >                         <!--内部访问action-->
                   <result name="success">/jsp/booksuccess.jsp</result>
                   <interceptor-ref name="loginStack"></interceptor-ref>
            </action>
    
        </package>

    画个页面:

        <title>登陆页面</title>
    </head>
    <body>
    
       <s:form action="/inter/login" method="POST">
           <s:textfield  name="username"></s:textfield> <br/>
           <s:textfield name="pwd"></s:textfield><br/>
           <s:submit value="提交"></s:submit>
       </s:form>
    </body>
    </html>

    创建Action:

     private String pwd;
    
        private String username;
    
        public String execute() throws Exception {
    
            System.out.println(pwd+"-------------"+username);
            Map<String, Object> session = ActionContext.getContext().getSession();
            if(pwd!=null&&username!=null) {
                if (pwd.equals("1") && username.equals("1")) {
                    session.put("username",username);
                    System.out.println("login successg");
                    return SUCCESS;
                }else{
                    return LOGIN;
                }
            }else if(session.get("username")!=null){
                System.out.println("check session");
                return SUCCESS;
            }else{
                System.out.println("return login");
                return  LOGIN;
            }
        }

    省略get 和set

    首先测试在没有登陆的情况下试着访问内部action

    后台 打印结果:

    /interbook---------------------null
    返回登陆
    login------------------

    返回登陆页面,说明这个简单的session验证登陆成功的拦截非登陆的情况 下访问内部action

    测试登陆 ,action有个简单的逻辑判断  

    点击提交:进入欢迎界面,看后台打印数据,拿到name和pwd  走逻辑判断,返回给拦截器,然后拦截器去匹配配置文件中result

    信息: Deploying web application directory D:TomcatTomcat2Tomcat 7.0webappsmanager
    十月 25, 2017 2:22:58 下午 org.apache.catalina.startup.HostConfig deployDirectory
    信息: Deployment of web application directory D:TomcatTomcat2Tomcat 7.0webappsmanager has finished in 110 ms
    /interlogin---------------------null
    1-------------1
    login successg
    判断登陆
    success------------------

     当再次访问登陆验证时候

     

    /interlogin---------------------1
    null-------------null
    check session
    判断登陆
    success------------------

     由于登陆成功之后将用户放入session中了,所以再次访问登陆路径的时候,判断的 是session,session不为空说明已经登陆了,返回success

    这个时候 就可以访问内部的action

     这就是一个简单的sturts2 自定义拦截器小案例!

  • 相关阅读:
    C#图解教程学习笔记——类和继承
    C#图解教程学习笔记——类相关的概念
    C#图解教程学习笔记——方法
    C#图解教程学习笔记——数据类型与数据存储
    模板方法模式
    命令模式
    访问者模式
    观察者模式
    策略模式
    单体【其他模式】
  • 原文地址:https://www.cnblogs.com/zhangyu0217----/p/7728415.html
Copyright © 2020-2023  润新知