• 个人总结的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
  • 相关阅读:
    数据结构实验报告(四)
    数据结构实验报告(三)
    数据结构实验报告(一)
    数据结构实验报告(二)
    Java基础之排序
    1070 Mooncake
    1071 Speech Patterns
    1438. Longest Continuous Subarray With Absolute Diff Less Than or Equal to Limit
    5403. Find the Kth Smallest Sum of a Matrix With Sorted Rows
    1072 Gas Station
  • 原文地址:https://www.cnblogs.com/anhelida/p/3963146.html
Copyright © 2020-2023  润新知