SpringMVC 拦截器


这里写图片描述


拦截器

FirstInterceptor.java

package com.jxust.springmvc.interceptors;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class FirstInterceptor implements HandlerInterceptor {

    /**
     * 渲染视图之后被调用 ,释放资源
     */
    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("[FirstInterceptor] afterCompletion");

    }
    /**
     * 调用目标方法之后,渲染视图之前
     * 可以对请求域中的属性和视图作出修改
     */
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        System.out.println("[FirstInterceptor] postHandle");

    }
    /**
     * 该方法在目标方法之前被调用
     * return true 则继续调用后续的拦截器和目标方法
     * return false 当前和后续的拦截器都不会执行
     * 可以考虑做权限,日志,事务等 ,乱码处理
     */
    @Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        System.out.println("[FirstInterceptor] preHandle");
        /*arg0.setCharacterEncoding("utf-8");//设置请求的字符编码
        //对用户是否登录进行判断
        if(arg0.getSession().getAttribute("user")==null){
            //没有登录,跳转到login.jsp
            arg0.getRequestDispatcher("/login.jsp").forward(arg0, arg1);;
            return false;
        }*/
        return true;
    }
}

SecondInterceptor.java

package com.jxust.springmvc.interceptors;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class SecondInterceptor implements HandlerInterceptor {

    /**
     * 渲染视图之后被调用 ,释放资源
     */
    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("[SecondInterceptor] afterCompletion");

    }
    /**
     * 调用目标方法之后,渲染视图之前
     * 可以对请求域中的属性和视图作出修改
     */
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        System.out.println("[SecondInterceptor] postHandle");

    }
    /**
     * 该方法在目标方法之前被调用
     * return true 则继续调用后续的拦截器和目标方法
     * return false 当前和后续的拦截器都不会执行
     * 可以考虑做权限,日志,事务等 
     */
    @Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        System.out.println("[SecondInterceptor] preHandle");

        return true;
    }

}

拦截器配置

    .
    .
    <!--配置自定义的拦截器  -->
        <mvc:interceptors>
            <bean class="com.jxust.springmvc.interceptors.FirstInterceptor"></bean>
            <!-- 配置拦截器(不)作用的路径 -->
            <mvc:interceptor>
                <mvc:mapping path="/emps"/>
                <mvc:exclude-mapping path="/hello"/>
                <bean class="com.jxust.springmvc.interceptors.SecondInterceptor"></bean>
            </mvc:interceptor>
        </mvc:interceptors>
        .
        .

return false ,则指定的方法(或所有)将不能执行

执行顺序

这里写图片描述

像收费站的模式,依次通过收费站1,收费站2,返回的时候,先通过收费站2,在通过收费站1,多个类似。

 3个方法的作用顺序,正序,反序,反序
[FirstInterceptor] preHandle
[SecondInterceptor] preHandle
[SecondInterceptor] postHandle
[FirstInterceptor] postHandle
[SecondInterceptor] afterCompletion
[FirstInterceptor] afterCompletion
---------------------------------------------
如果 SecondInterceptorpreHandlefalse
[FirstInterceptor] preHandle
[SecondInterceptor] preHandle
[FirstInterceptor] afterCompletion
如果其中一个拦截器设置了preHandlerreturn false,就不需要释放资源了
return true的拦截器,需要释放资源

拦截器和过滤器的区别

  • 过滤器Filter依赖于Servlet容器,基于回调函数,过滤范围大,可以过滤请求和资源等
  • 拦截器Interceptor 依赖于框架容器,基于反射机制,只过滤请求

    拦截器的作用:可以处理Web应用中请求的一些通用性问题,共性问题在拦截器中处理,可以减少重复代码,便于维护

回调函数

⑴定义一个回调函数;
⑵提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;
⑶当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。

声明一个函数给调用者,发生特定条件时执行的某个行为,行为就是该声明的函数的执行。
之所以把函数交给调用者,主要是依靠它的特定功能(检测某个事件发生等等);商店买东西,没货,我留电话,到货通知我,就是类似的流程。

当程序跑起来时,一般情况下,应用程序(application program)会时常通过API调用库里所预先备好的函数。但是有些库函数(library function)却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务。这个被传入的、后又被调用的函数就称为回调函数(callback function)。…….

知乎https://www.zhihu.com/question/19801131

反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

动态语言的特点
程序运行时,允许改变程序结构或变量类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值