SpringBoot2.1.X 自定义Interceptor

SpringBoot的拦截器

 1、注册拦截器: @Configuration
		SpringBoot2.X 新版本配置拦截器 implements WebMvcConfigurer
 2、自定义拦截器 HandlerInterceptor
		preHandle:调用Controller某个方法之前
		postHandle:Controller之后调用,视图渲染之前,如果控制器Controller出现了异常,则不会执行此方法
		afterCompletion:不管有没有异常,这个afterCompletion都会被调用,用于资源清理
	
 3、按照注册顺序进行拦截,先注册,先被拦截

结构图:

 注册拦截器: RegisterWebMvcConfigurer 

package com.example.newdemo.interceptor;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 配置规则:WebMvcConfigurer接口中写方法的哦!
 * jdk8之后就会在
 */
@Configuration
public class RegisterWebMvcConfigurer implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        //注册自定义的拦截器哦! (指定路径需要拦截哦)
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/we/*/**");
        registry.addInterceptor(new UserInterceptor());

        //调用父类的拦截器继续Go
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

自定义拦截器 (2个)

/**
 * 自定义拦截器
 */
@Component
public class LoginInterceptor implements HandlerInterceptor {

    /**
     * 进入controller层之前 拦截请求
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("---> preHandle LoginInterceptor");
        //获得请求的数据
//        String users =request.getParameter("name");
//        response.getWriter().print("fail!!!");
        return true;
    }

    /**
     *  调用完controller之后,视图渲染之前
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("--->  postHandle LoginInterceptor");
        //调用父类的
        HandlerInterceptor.super.postHandle(request,response,handler,modelAndView);
    }

    /**
     * 整个完成之后,通常用于资源清理
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("--->  afterCompletion LoginInterceptor");
        HandlerInterceptor.super.afterCompletion(request,response,handler,ex);
    }
}

测试控制:

效果:

总之,就能看出单个拦截器的执行顺序.

1. 在控制器方法执行之前, 执行的 preHandle 方法

2. 执行控制器的inter1方法

3. 执行完inter1, 解析view之前(如果有的话), 执行拦截器的 posthandle 方法

4. 解析view

5. 解析完之后, 执行 afterCompletion 方法

注意要点:

     拦截器不生效常见问题:
		1)是否有加@Configuration
		2)拦截路径是否有问题 **  和 * 
		3)拦截器最后路径一定要 “/**”, 如果是目录的话则是 /*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值