zoukankan      html  css  js  c++  java
  • 个人总结的Struts2拦截器使用和拦截栈的配置,基于注解的方式

    Struts2的拦截器是个好利器!尤其是自定义拦截器,以下是我个人整理的很详细的整个流程,希望给大家带来帮助,有更好见解的希望可以提出宝贵的意见。

    原理:

    a)         Web浏览器发送请求

    b)         首先通过一组Struts2默认的拦截栈 dispatcher (或者 ServletFilter)

    c)         自定义interceptor(拦截器)

    d)         Action

    e)         Result

    struts.xml配置如下:

    <package name=”default” namespace=”/” extends=”struts-default”>
                        <--所有的配置都应放在package中-->
        <interceptors>
            <-- 所有的拦截器自定义的配置和引用、已经拦截栈的定义都应放在interceptors中-->
            <-- 自定义拦截器 name指定自定义拦截器的引用名称  class 指定该拦截器的实现类(完整路径) -->
            <interceptor name="sessionCheck" class="com.cqrcb.perinvite.interceptor.AuthorityInterceptor" /> 
            
            <-- 自定义拦截栈 name 指定自定义拦截栈的引用名称 -->
                        <interceptor-stack name="sessionCheckStack">
                            <-- name为所要引用的拦截器的引用名称 刚才定义了一个name为 sessionCheck的拦截器,则引用就为 sessionCheck--> 
                            <-- 每一个自定义的拦截栈都应该必须配上defaultStack拦截栈,该拦截栈是Struts2默认的拦截栈,里面封装了一组拦截器--> 
    <interceptor-ref name="defaultStack" />
                            <interceptor-ref name="sessionCheck" />
            </interceptor-stack>
        </interceptors>
        < --  配置全局默认的Action -- >
        <default-action-ref name="IndexAction" /> 
        
        < -- 配置全局默认的result-- >
                    <global-results>
                        <-- 配置token的invalid.token的返回视图,即当页面重复提交,页面将自动转到/error.jsp页面并提示 -- >
                        <result name="invalid.token">/error.jsp</result>
                        <result name="error">/error.jsp</result>
                        
                        <-- 配置name为backhome的resule,重定向为IndexAction-- >
                        <result name="backhome"  type="redirectAction">IndexAction</result>
                        <-- 配置name为testChain的resule, 转发跳转到testAction -- >
                        <result name="testChain"  type="chain ">testAction</result>
        </global-results>
        < --使用拦截器有两种方式,annoction(注解)和xml配置,以下是XML配置-->
                    <action name="testAction" class="com.cqrcb.perinvite.resume.action.testAction">
                        <-- 在此Action访问之前引入sessionCheckStack拦截栈 name为拦截栈定义的引用名称-- >
                        <-- 此sessionCheckStack已经包含了自定义拦截器和Struts2的默认拦截栈,所以直接引用sessioncheckstack即可-- >
                        <interceptor-ref name=" sessionCheckStack "/>
                        
                        <-- 如果直接引用自定义的拦截器,即没有包含默认的拦截栈,则需要引用Struts2的默认拦截栈,以下-- >
                        <interceptor-ref name=”testInter”/>
                        <interceptor-ref name=”defaultStack”/>
                        
                        <-- 一个Action中只要有一个defaultStack即可,如果引用的拦截栈有了defaultStack,则就不必再引用defaultStack,否则,引之-- >
    
    <result name="success">
                                Success.jsp
                            </result>
                            <result name="input">
                                input.jsp
                            </result>
        </action>
    </package>

    annoction注解中使用拦截器和拦截栈

    //直接在类名称的上端写入即可,value中指定要引入的拦截器的名称即可
    @InterceptorRef(value="token")
    //拦截栈的引用,蓝色字体即拦截栈的引用名称
    @InterceptorRefs(@InterceptorRef("sessionCheckStack"))



    自定义拦截器的javabean

    package com.cqrcb.perinvite.interceptor;
     
    import com.cqrcb.perinvite.logon.action.IndexAction;
    import com.netbank.pub.vo.core.PbClientInfoVO;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
    /**
     * 权限拦截Action
     * @author wangyupeng
     *  
     */
    //继承 AbstractInterceptor 类
    public class AuthorityInterceptor extends AbstractInterceptor{
     
        private static final long serialVersionUID = 4546936882066035745L;
     
        //重写intercept方法
        public String intercept(ActionInvocation invocation) throws Exception {
             
            //获取Action的拦截路径
            ActionContext ax = invocation.getInvocationContext();
             //获取Action对象  
            Object action = invocation.getAction();
     
            // 对IndexAction不做该项拦截   action instanceof IndexAction 解释为如果Action的实例为IndexAction
            if (action instanceof IndexAction) {  
                //如果是IndexAction,则进行执行,即不做拦截
                return invocation.invoke();  
            } 
            //获取session中key为pinfo的对象
            PbClientInfoVO pinfo =(PbClientInfoVO) ax.getSession().get("pinfo");
            if(pinfo==null){
                //如果pinfo为null,则返回全局result为backhone的视图
                return "backhome";
            }
            //如果都不为false,则不做拦截
            return invocation.invoke();
        }  
         
    }

    struts2的自定义拦截器有很多方式,本文的内容是前置拦截,即获取到action的请求所做的拦截。struts2还有后置拦截和中间拦截,这两种也是很常用的,有时间整理完之后我会发到博客,大家一起探讨。

    乐于分享,共同进步 转载请注明出处,多谢! http://www.cnblogs.com/anhelida
  • 相关阅读:
    atitit.nfc 身份证 银行卡 芯片卡 解决方案 attilax总结
    atitit.php 流行框架 前三甲为:Laravel、Phalcon、Symfony2 attilax 总结
    Atitit.执行cmd 命令行 php
    Atitit. 图像处理jpg图片的压缩 清理垃圾图片 java版本
    atitit。企业组织与软件工程的策略 战略 趋势 原则 attilax 大总结
    atitit. 管理哲学 大毁灭 如何防止企业的自我毁灭
    Atitit.java的浏览器插件技术 Applet japplet attilax总结
    Atitit.jquery 版本新特性attilax总结
    Atitit. 软件开发中的管理哲学一个伟大的事业必然是过程导向为主 过程导向 vs 结果导向
    (转)获取手机的IMEI号
  • 原文地址:https://www.cnblogs.com/anhelida/p/3963146.html
Copyright © 2011-2022 走看看