springboot中 , 基于spring添加自定义intercepter拦截器

  1. 基于springmvc的拦截器接口 , 编写其实现类即可
package com.imooc.demo.intercepter;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
/**
 * 基于spring提供的intercepter编写拦截器
 *  该方式也有问题
 *      1. 该方式获取不到具体牵连方法的参数值.
 *      2. 通过查看源码 -> DispatcherServlet.doService() 即可获知
 *  解决:
 *      1. 通过spring提供的切片功能可实现. -> aspect
 */
@Component
public class MyIntercepter implements HandlerInterceptor{
    /**
     * 请求前
     * @param request
     * @param httpServletResponse
     * @param handler controllerHandler对象
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse httpServletResponse, Object handler) throws Exception {
        System.out.println("preHandle...");
        System.out.println(((HandlerMethod)handler).getBean().getClass().getName());
        System.out.println(((HandlerMethod)handler).getMethod().getName());
        request.setAttribute("startTime",System.currentTimeMillis());
        return true;
    }
    /**
     * 请求后 , 无抛出异常时
     * @param request
     * @param httpServletResponse
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse httpServletResponse, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle...");
        Long start = (Long) request.getAttribute("startTime");
        System.out.println("time.." + start);
    }
    /**
     * 请求后,无论是否抛出异常 , 均执行
     * @param httpServletRequest
     * @param httpServletResponse
     * @param o
     * @param e
     * @throws Exception
     * 注意: controlleradvice的执行是在该方法之前的.对exception进行处理过. 该方法接收不到该异常
     *  2. 会拦截所有的controller,包括spring提供的controller , 如baseerrorcontroller 异常处理handler
     */
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("afterCompletion...");
        System.out.println(e.getStackTrace());
        System.out.println("end...");
    }
}
  1. 配置文件 , 实现WebMvcConfigurerAdapter , 将拦截器添加到拦截器链中
package com.imooc.demo.intercepter.config;
import com.imooc.demo.filter.MyFilter2;
import com.imooc.demo.intercepter.MyIntercepter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import java.util.ArrayList;
import java.util.List;
/**
 * springboot中,继承为springmvc提供的WebMvcConfigurerAdapter , 其相当于 springmvc的springmvc.xml配置
 */
@Configuration
public class SpringmvcWebconfig extends WebMvcConfigurerAdapter{

    @Autowired
    private MyIntercepter myIntercepter;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myIntercepter);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_34531925/article/details/81183914