Spring boot的拦截器基础篇(一)

 
 

原理

(1)拦截器实现了对每一个请求处理前后进行相关的业务,类似于Servletfilter。让普通的bean实现HanlderInterceptor接口或者继承HandlerInterceptorAdapter类实现自定义的拦截器。

(2)新建另外一个类通过继承重写WebMvcConfigurerAdapteraddInterceptors的方法来注册自定义的拦截器,业务含义是每次处理的时间。只要发送了请求首先都会经过拦截器

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界面打印出如下信息

*******拦截器开始*******

1525843540908
1525843540908 1525843540931
本次耗时为:23ms


猜你喜欢

转载自blog.csdn.net/qq_31940707/article/details/80252346