案例
WebConfig
package com.springbootw2.config;
import com.springbootw2.interceptor.TimeInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
*WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
/**
* 添加拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TimeInterceptor()) //添加拦截器
.addPathPatterns("/**")//拦截规则(所有)
.excludePathPatterns("/postRest");//排除规则
}
}
RestT
package com.springbootw2.controller;
import com.springbootw2.dto.Persion;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class RestT {
private final RestTemplate t;
//当bean没有无参构造函数时,spring将自动拿到有参的构造函数进行自动注入
//RestTemplateBuilder已经存在于IOC容器中
public RestT(RestTemplateBuilder b){
this.t = b.build();
}
@RequestMapping("/getRest")
private String getRest(){
Persion p = t.getForObject("http://localhost:8080/user/getUser/{id}", Persion.class,"99");
return p.getUserName();
}
@RequestMapping("/postRest")
private String postRest(){
Persion ps = new Persion();
ps.setUserName("卢大宝");
//包含响应的一些信息
ResponseEntity<Persion> pp = t.postForEntity("http://localhost:8080/user/postUser",ps ,Persion.class);
Persion p = pp.getBody();
return p.getUserName();
}
}
TimeInterceptor(重写拦截器的3个方法)
package com.springbootw2.interceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.Duration;
import java.time.LocalDateTime;
public class TimeInterceptor implements HandlerInterceptor {
Logger l = LoggerFactory.getLogger(TimeInterceptor.class);
LocalDateTime begin;
/**
* 请求之前
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
begin = LocalDateTime.now();
return true;
}
/**
* 请求之后,视图渲染之前
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
LocalDateTime end = LocalDateTime.now();
Duration d = Duration.between(begin, end);
long t = d.toMillis();
l.info(t +"毫秒");
l.info(request.getRequestURI());
}
/**
* 请求之后,视图渲染之后
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
测试