原理:
(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.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 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 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"); } }最后添加一个界面端请求
package com.example.Spring.Boot1; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @EnableAutoConfiguration @SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class}) public class SpringBoot1Application { @RequestMapping("/aa") public String aa() { return "测试第一次!!!"; } }
最后输入界面地址:http://localhost:8011/aa
每次启动程序后,界面上只要发送请求都会先经过DemoInterceptor 类中,然后将这里面的执行过程都执行一遍。
结果:在console界面打印出如下信息
*******拦截器开始*******
15258435409081525843540908 1525843540931
本次耗时为:23ms