拦截器:
见字如意
正文:
定义一个实现了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
再附上盗来滴图吧:源