在SpringBoot中我们可以使用HandlerInterceptorAdapter这个适配器来实现自己的拦截器。这样就可以拦截所有的请求并做相应的处理。
在HandlerInterceptorAdapter中主要提供了以下的方法:
preHandle:在方法被调用前执行。在该方法中可以做类似校验的功能。如果返回true,则继续调用下一个拦截器。如果返回false,则中断执行,也就是说我们想调用的方法不会被执行,但是你可以修改response为你想要的响应。
postHandle:在方法执行后调用。
afterCompletion:在整个请求处理完毕后进行回调,也就是说视图渲染完毕或者调用方已经拿到响应。
使用实例-记录日志:
package com.trade.work.config;
import com.alibaba.fastjson.JSON;
import com.trade.work.common.utils.TradeStringUtils;
import lombok.extern.slf4j.Slf4j;
import org.jboss.logging.MDC;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.UUID;
/**
* @desc
* @date 2019/1/25
*/
@Slf4j
@Component
public class LogInterceptor extends HandlerInterceptorAdapter {
// 请求时间
private final static String REQUEST_TIME = "_request_time";
// default
private final static String DEFAULT = "other";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String method = (request != null && request.getMethod() != null) ? request.getMethod().toLowerCase() : "";
if (!method.equals("head")) {
preparedRequestHeader(request);
log.info("before request:" + JSON.toJSONString(MDC.getMap()));
request.setAttribute(REQUEST_TIME, System.currentTimeMillis());
}
return super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
String method = (request != null && request.getMethod() != null) ? request.getMethod().toLowerCase() : "";
if (request.getAttribute(REQUEST_TIME) != null && !method.equals("head")) {
long time = Long.valueOf(request.getAttribute(REQUEST_TIME).toString());
log.info("after request: 耗时:" + (System.currentTimeMillis() - time));
}
super.afterCompletion(request, response, handler, ex);
}
private void preparedRequestHeader(HttpServletRequest request) {
// client OS is APP request
String appVersion = request.getHeader(RequestEnvironment.APP_VERSION) == null ? DEFAULT : request.getHeader(RequestEnvironment.APP_VERSION);
String user_agent = request.getHeader(RequestEnvironment.USER_AGENT) == null ? DEFAULT : request.getHeader(RequestEnvironment.USER_AGENT);
String access_token = request.getHeader(RequestEnvironment.ACCESS_TOKEN) == null ? "无token" : request.getHeader(RequestEnvironment.ACCESS_TOKEN);
String url = request.getRequestURL().toString();
String method = request.getMethod();
String params = JSON.toJSONString(request.getParameterMap());
String machineVersion = request.getHeader(RequestEnvironment.MACHINE_VERSIONS) == null ? DEFAULT : request.getHeader(RequestEnvironment.MACHINE_VERSIONS);
RequestEnvironment.putAccessToken(access_token);
RequestEnvironment.putUserAgent(user_agent);
RequestEnvironment.putTraceId(UUID.randomUUID().toString().replaceAll("-", ""));
RequestEnvironment.putAppVersion(appVersion);
RequestEnvironment.putRemoteAddr(TradeStringUtils.getRemoteAddr(request));
RequestEnvironment.putMachineVersions(machineVersion);
RequestEnvironment.putRequestUrl(url);
RequestEnvironment.putRequestMethod(method);
RequestEnvironment.putRequestParam(params);
}
//POST请求参数
public static byte[] readInputStream(InputStream inStream) throws Exception {
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
}
outSteam.close();
inStream.close();
return outSteam.toByteArray();
}
}