原理:
(1)拦截器实现了对每一个请求处理前后进行相关的业务,类似于Servlet的filter。让普通的bean实现HanlderInterceptor接口或者继承HandlerInterceptorAdapter类实现自定义的拦截器。
(2)新建另外一个类通过继承重写WebMvcConfigurerAdapter的addInterceptors的方法来注册自定义的拦截器,业务含义是每次处理的时间。只要发送了请求首先都会经过拦截器
WebMvcConfigurerAdapter具体的方法
/** 解决跨域问题 **/
public voidaddCorsMappings(CorsRegistry registry) ;
/** 添加拦截器 **/
voidaddInterceptors(InterceptorRegistry registry);
/** 这里配置视图解析器 **/
voidconfigureViewResolvers(ViewResolverRegistry registry);
例子:
@Override
public voidconfigureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/jsp/", ".jsp");
registry.enableContentNegotiation(new MappingJackson2JsonView());
}
/** 配置内容裁决的一些选项 **/
这个方法是专门用来配置内容裁决的一些参数的。这个比较简单,我们直接通过一个例子看:
voidconfigureContentNegotiation(ContentNegotiationConfigurer configurer);
例子:
publicvoid configureContentNegotiation(ContentNegotiationConfigurer configurer) {
/* 是否通过请求Url的扩展名来决定mediatype */
configurer.favorPathExtension(true)
/* 不检查Accept请求头 */
.ignoreAcceptHeader(true)
.parameterName("mediaType")
/* 设置默认的media yype */
.defaultContentType(MediaType.TEXT_HTML)
/* 请求以.html结尾的会被当成MediaType.TEXT_HTML*/
.mediaType("html",MediaType.TEXT_HTML)
/* 请求以.json结尾的会被当成MediaType.APPLICATION_JSON*/
.mediaType("json",MediaType.APPLICATION_JSON);
}
/** 视图跳转控制器 **/
voidaddViewControllers(ViewControllerRegistry registry);
/** 静态资源处理 **/
voidaddResourceHandlers(ResourceHandlerRegistry registry);
/** 默认静态资源处理器 **/
voidconfigureDefaultServletHandling(DefaultServletHandlerConfigurer configurer);
代码如下:
例如:实现一个发送一个请求看发送请求总共花费的时间
package com.example.Spring.Boot1.Interceptor;
import java.nio.charset.Charset;
import java.util.List;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@RestController
@RequestMapping("/testInterceptor")
public class DemoInterceptorTest extends WebMvcConfigurerAdapter {
/************解决乱码的问题*******************************/
public HttpMessageConverter<String> responseBodyConverter() {
StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
return converter;
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
converters.add(responseBodyConverter());
}
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(false);
}
/*******************这里是拦截器的调用********************/
public DemoInterceptor demoInterceptor() {
return new DemoInterceptor();
}
//注册拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(demoInterceptor());
}
}
//具体拦截干的事情。
重写preHandle类(这是发送请求前执行)和 postHandle类(这是发送结束后执行)
package com.example.Spring.Boot1.Interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
//拦截器
public class DemoInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("*******拦截器开始*******");
String title = request.getParameter("title");
String reader = request.getParameter("reader");
long time = System.currentTimeMillis();// 得到当前的时间
System.out.println(time);
request.setAttribute("starttime", time); // 通过request存储
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
long startime = (long) request.getAttribute("starttime");
long endtime = System.currentTimeMillis();
System.out.println(startime + " " + endtime);
request.removeAttribute("time");
request.removeAttribute("reader");
System.out.println("本次耗时为:" + new Long(endtime - startime) + "ms");
}
}
结果:
每次启动程序后,界面上只要发送请求都会先经过DemoInterceptor 类中,然后将这里面的执行过程都执行一遍。
会出现:
*******拦截器开始*******
1525834205333