victory的博客

长安一片月,万户捣衣声

0%

SpringMVC | 拦截器

拦截器 HandlerInterceptor

1.在SpringMVC配置文件(springMVC.xml)中进行以下配置:

<mvc:interceptors>
    <!-- 默认拦截所有请求 -->
    <!-- 第一种方式 -->
    <bean class="com.atguigu.interceptor.FirstInterceptor"></bean>
    <bean class="com.atguigu.interceptor.SecondInterceptor"></bean>
    <!-- 
        第二种方式
        此方式要求拦截器上必须加注解@Component
     -->
    <!-- <ref bean="firstInterceptor" /> -->
    
    <!-- 设置自定义拦截方式 -->
    <!-- <mvc:interceptor>
        <bean></bean>
        <mvc:mapping path=""/>
        <mvc:exclude-mapping path=""/>
    </mvc:interceptor> -->
</mvc:interceptors>

2.test.jsp

<a href="testInterceptor">测试拦截器</a>

3.TestInterceptorController.java(测试类)

package com.atguigu.test;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TestInterceptorController {
    /**
     * 当有多个拦截器时,
     * preHandle:按照拦截器数组正向顺序执行
     * postHandle:按照拦截器数组反向顺序执行
     * afterCompletion:按照拦截器数组反向顺序执行
     * 
     * 当多个拦截器的preHandle有不同的值时
     * 第一个返回false,第二个返回false:只有第一个的preHandle会执行
     * 
     * 第一个返回true,第二个返回false:两个(全部)拦截器的preHandle都会执行,
     * 但是(全部)postHandle都不会执行,
     * 而afterCompletion只有第一个(返回false的拦截器之前的所有afterCompletion)会执行
     * 
     * 第一个返回false,第二个返回true:只有第一个的preHandle会执行
     */
    @RequestMapping("/testInterceptor")
    public String testInterceptor(){
        //System.out.println(1/0);
        return "success";
    }
}

4.FirstInterceptor.java

package com.atguigu.interceptor;

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

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

@Component
public class FirstInterceptor implements HandlerInterceptor{

    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("First:afterCompletion");
    }

    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        System.out.println("First:posthandle");
    }

    @Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        System.out.println("First:preHandle");
        return true;//true:放行 false:拦截
    }
}

5.SecondInterceptor.java

package com.atguigu.interceptor;

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

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

@Component
public class SecondInterceptor implements HandlerInterceptor{

    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("Second:afterCompletion");
    }

    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        System.out.println("Second:posthandle");
    }

    @Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        System.out.println("Second:preHandle");
        return false;//true:放行 false:拦截
    }
}