【springboot】拦截器

拦截器:
    见字如意
正文:

定义一个实现了WebRequestInterceptor 接口的

package com.example.demo.Config;

import org.springframework.ui.ModelMap;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.context.request.WebRequestInterceptor;

/**
 * Created by Administrator on 2018/7/4.
 */
public class WebInterceptor implements WebRequestInterceptor {

    /**
     * 资源准备工作:WebRequest 的setAttribute(name, value, scope)
     *  Integer scope
     *      SCOPE_REQUEST=0 只有在当前request可以访问
     *      SCOPE_SESSION=1 环境容许,局部隔离session,否则代普通session
     *      SCOPE_GLOBAL_SESSION=2 环境容许,全局共享session,否同上,貌似被取消了
     *
     * @param webRequest
     * @throws Exception
     */
    @Override
    public void preHandle(WebRequest webRequest) throws Exception {

        System.out.println("WebRequestInterceptor-----------------");
        webRequest.setAttribute("session","session",WebRequest.SCOPE_REQUEST);
        webRequest.setAttribute("session","session",WebRequest.SCOPE_SESSION);

    }

    /**
     * Controller后被调用,在视图返回被渲染前被调用
     *
     * @param webRequest 传递整个请求数据
     * @param modelMap   controller处理后返回model对象
     * @throws Exception
     */
    @Override
    public void postHandle(WebRequest webRequest, ModelMap modelMap) throws Exception {

        System.out.println("java.util.ConcurrentModificationException: null");

    }

    /**
     * 请求处理完,视图返回并渲染后,资源释放
     *
     * @param webRequest 可以preHandle资源传到这里释放
     * @param e          当前请求的异常,已被spring处理则为null
     * @throws Exception
     */
    @Override
    public void afterCompletion(WebRequest webRequest, Exception e) throws Exception {

        System.out.println(e+"over---------------");

    }
}

定义继承了HandlerInterceptorAdapter的拦截器

package com.example.demo.Config;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

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

/**
 * 拦截器
 * 继承实现自定义拦截器
 * 发起请求进入拦截器链,先运行所有拦截器的preHandle方法
 * 当preHandle返回false则后面的拦截器不再执行(DispatcherServlet处理器认为已经处理完了请求)
 * 从当前拦截器往回执行所有拦截器的afterCompletion,当前的器的这个方法不会执行
 * 当preHandle全true,运行被拦截的controller
 * 进入拦截器链,运行所有拦截器的postHandle
 * 执行顺序与preHandle相反,有机会修改ModelAndView
 * 往回执行afterCompletion
 * 顺序与preHandle相反,用于清理资源
 * 拦截器抛出异常时,从当前器往回执行all器的afterCompletion
 * <p>
 * Created by Administrator on 2018/7/4.
 */
public class DemoInterceptor extends HandlerInterceptorAdapter {


    /*请求发生前发生*/
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) {
        long startTime = System.currentTimeMillis();
        request.setAttribute("startTime", startTime);
        return true;// 只有返回true才会继续向下执行,返回false取消当前请求
    }

    /*请求发生完成后发生*/
    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) {
        long startTime = (long) request.getAttribute("startTime");
        request.removeAttribute("startTime");
        long endTime = System.currentTimeMillis();
        System.out.println("本次请求处理的时间为" + new Long(endTime - startTime) + "ms");
        request.setAttribute("handlingTime", endTime - startTime);
    }

    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response, Object handler,
                                Exception ex) {
        System.out.println("在整个请求结束之后被调用,主要是用于进行资源清理工作");
    }

}

加入到项目中:WebMvcConfigurer

package com.example.demo.Config;

import org.aopalliance.intercept.Interceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.WebRequestInterceptor;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

/**
 * 实现接口,重写其方法对mvc配置
 * Created by Administrator on 2018/7/4.
 */
@Configuration
@EnableWebMvc//开启支持
@ComponentScan("com.example.demo")
public class MyMVCConfig implements WebMvcConfigurer {

    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver =
                new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/classes/views/");
        viewResolver.setSuffix(".jsp");
        viewResolver.setViewClass(JstlView.class);
        return viewResolver;
    }

    public void addResourceHandlers(ResourceHandlerRegistry resourceHandlerRegistry) {
        //addResourceLocations文件放置目录,Hander对外暴露访问路径
        resourceHandlerRegistry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets/");
    }

    @Bean
    public DemoInterceptor demoInterceptor() {
        return new DemoInterceptor();
    }

    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(demoInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/assest/**");//不需要拦截的路径

        registry.addWebRequestInterceptor(webInterceptor());
    }

    @Bean
    public WebInterceptor webInterceptor() {
        return new WebInterceptor();
    }


}

效果图:
访问 http://localhost:8080/index
这里写图片描述

和上述 理论无差了

拦截器还是很简单的

感谢分享:
《JavaEE开发的颠覆者Spring Boot实战》
https://blog.csdn.net/u012420654/article/details/52098592
https://www.jianshu.com/p/f14ed6ca4e56
https://blog.csdn.net/gisam/article/details/78257991
https://www.cnblogs.com/softidea/p/6064064.html
https://blog.csdn.net/catoop/article/details/50501696

再附上盗来滴图吧:
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/ma15732625261/article/details/80910811