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.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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值