Struts2拦截器

**技术分析之Struts2的拦截器技术**
    
    1. 拦截器的概述
        * 拦截器的作用:对Action类中的方法进行拦截,进行程序的编写。
        * 拦截器就是AOP(Aspect-Oriented Programming)的一种实现。(AOP是指用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。)
        * 过滤器:过滤从客服端发送到服务器端请求的
        
        * 拦截器:拦截对目标Action中的某些方法进行拦截
            * 拦截器不能拦截JSP
            * 拦截到Action中某些方法
    
    2. 拦截器和过滤器的区别
        1)拦截器是基于JAVA反射机制的(拦截器配置的都是类的全路径),而过滤器是基于函数回调的(过滤器实例是由Tomcat服务器来创建的)
        2)过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器
        3)拦截器只能对Action请求起作用(Action中的方法),而过滤器可以对几乎所有的请求起作用(CSS JSP JS),拦截器在action对象创建之后,方法之前执行
    拦截器底层原理:aop和责任链模式
----------
    
**技术分析之自定义拦截器和配置**
    继承MethodFilterInterceptor可以配置使action中某些方法不进行拦截,继承AbstractInterceptor都拦截
    1. 编写拦截器,需要实现Interceptor接口,实现接口中的三个方法
        public class OrderInterceptor extends AbstractInterceptor{
            private static final long serialVersionUID = 3168450442031605321L;
            /**
             * 拦截的方法
             */
            public String intercept(ActionInvocation ai) throws Exception {
                // 输出
                System.out.println("拦截器执行了22...");
                // 让下一个拦截器去执行,不要忘记加 return
                return ai.invoke();
            }
        }
    
    2. 需要在struts.xml中进行拦截器的配置,配置一共有两种方式
    在action中引入自定义拦截器,同时必须引入默认拦截器
        <!-- 定义了拦截器 第一种方式 -->
        <interceptors>
            <interceptor name="orderInterceptor" class="com.demo4.OrderInterceptor"/>
        </interceptors>
        
        <!-- 演示拦截器 -->
        <action name="order_*" class="com.demo4.OrderAction" method="{1}">
            <!-- 引入拦截器,只要是引入自定义的拦截器,那么默认栈的拦截器就不执行了 
            <interceptor-ref name="orderInterceptor"/>
            -->
            <!-- 手动引入默认栈的拦截器
            <interceptor-ref name="defaultStack"/>
            -->
        </action>
        
        <!-- 第二种配置方式:定义拦截器栈 -->
        <interceptors>
            <interceptor name="orderInterceptor" class="com.demo4.OrderInterceptor"/>
<interceptor name="logininterceptor"             class="cn.interceptor.LoginInterceptor"></interceptor>
            <!-- 自定义拦截器栈 -->
             <interceptor-ref name="logininterceptor">
                   <配置不拦截方法>
                    <param name="excludeMethods">login</param>
                </interceptor-ref>
            <interceptor-stack name="mystack">
                <interceptor-ref name="orderInterceptor"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>
        
        <!-- 演示拦截器 -->
        <action name="order_*" class="com.demo4.OrderAction" method="{1}">
            <!-- 引入自定义拦截器栈 -->
            <interceptor-ref name="mystack"/>
        </action>
    
----------
    
**拦截器案例**
    
    1. 完成了登录的功能
    2. 添加拦截器的功能(判断用户是否已经登录)
        * 编写UserInterceptor拦截器,重写intercept方法,在该方法中判断用户是否已经登录,代码如下:
            // 先获取到session,获取对象
            User user = (User) ServletActionContext.getRequest().getSession().getAttribute("existUser");
            if(user == null){
                // 获取到目标的Action的对象
                ActionSupport action = (ActionSupport) actionInvocation.getAction();
                action.addActionError("大哥,你得需要登录啊!!");
                // 没有登录
                return "login";
            }
            // 执行下一个拦截器
            return actionInvocation.invoke();
        
        * 配置拦截器
            * 注册拦截器
                <interceptors>
                    <interceptor name="userInterceptor" class="com.interceptor.UserInterceptor"/>
                </interceptors>
            
            * 在CustomerAction中引入拦截器(注意:不要再UserAction中引入拦截器,默认会对UserAction的login方法进行拦截,从而不能登陆成功,可以在配置不拦截login方法)
                <interceptor-ref name="userInterceptor"/>
                <interceptor-ref name="defaultStack"/>
    
    3. login.jsp页面存在的问题
        * 如果拦截器拦截成功了,会跳转到登录页面,登录成功后会默认在当前的窗口中显示。
        * 需要设置在父窗口中显示:设置如下:
            * <FORM id=form1 name=form1 action="${ pageContext.request.contextPath }/user_login.action" method=post target="_parent">
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值