1.自定义拦截器
package com.impl.modelserver.common.config.interceptor;
import com.alibaba.fastjson.JSON;
import com.impl.modelserver.po.CheckNamespaceLegalParam;
import com.impl.modelserver.service.IModelService;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.StreamUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
/**
* Description: 请求拦截器
*
* @version 1.0 @ClassName RequestInterceptor @Author xulei
* @date 2021/3/2 17:42
*/
@Component
@Order(1)
public class RequestInterceptor implements HandlerInterceptor {
private final Logger logger = LoggerFactory.getLogger(RequestInterceptor.class);
private static final String GET_METHOD = "GET";
private static final String POST_METHOD = "POST";
@Autowired private IModelService iModelService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
logger.info(
"请求方式===={},请求uri===={},response==={},拦截的方法==={}",
request.getMethod(),
request.getRequestURI(),
response,
((HandlerMethod) handler).getMethod().getName());
CheckNamespaceLegalParam checkNamespaceLegalParam = new CheckNamespaceLegalParam();
checkNamespaceLegalParam.setToken(request.getHeader("Authorization"));
checkNamespaceLegalParam.setProtocol(request.getScheme());
if (request.getMethod().toUpperCase().equals(GET_METHOD)) {
// checkNamespaceLegalParam.setToken(request.getHeader("Authorization"));
checkNamespaceLegalParam.setNamespace(request.getParameter("namespace"));
}
if (request.getMethod().toUpperCase().equals(POST_METHOD)) {
byte[] bodyBytes = StreamUtils.copyToByteArray(request.getInputStream());
String body = new String(bodyBytes, request.getCharacterEncoding());
checkNamespaceLegalParam.setNamespace(
JSON.parseObject(body, Map.class).get("namespace").toString());
logger.info("请求体:{}", body);
}
return iModelService.checkNamespaceLegal(checkNamespaceLegalParam);
}
}
2.由于post请求参数在body中获取,request中的资源只能获取一次,进而要将body保存下来,重写HttpServletRequestWrapper
package com.impl.modelserver.common.config.mvc;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StreamUtils;
/**
* Description: 解决请求拦截器获取body参数请求放过后报错问题Required request body is missing
*
* @version 1.0 @ClassName CustomHttpServletRequestWrapper @Author xulei
* @date 2021/3/3 15:46
*/
// @Component
public class CustomHttpServletRequestWrapper extends HttpServletRequestWrapper {
private final Logger logger = LoggerFactory.getLogger(CustomHttpServletRequestWrapper.class);
/** 缓存下来的HTTP body */
private byte[] body;
public CustomHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
body = StreamUtils.copyToByteArray(request.getInputStream());
}
@Override
public ServletInputStream getInputStream() throws IOException {
if (body == null) {
body = new byte[0];
}
InputStream bodyStream = new ByteArrayInputStream(body);
return new ServletInputStream() {
@Override
public int read() throws IOException {
return bodyStream.read();
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {}
};
}
// 对外提供读取流的方法
@Override
public BufferedReader getReader() throws IOException {
// InputStream bodyStream = new ByteArrayInputStream(body);
return new BufferedReader(new InputStreamReader(getInputStream()));
}
}
3.自定义过滤器,并且注册进springboot
package com.impl.modelserver.common.config.mvc;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* Description: 过滤器
*
* @version 1.0 @ClassName WebFilter @Author xulei
* @date 2021/3/3 16:42
*/
@Order(-1)
@javax.servlet.annotation.WebFilter(filterName = "webFilter", urlPatterns = "/*")
@Component
public class WebFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(
ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
throws IOException, ServletException {
ServletRequest request = null;
if (servletRequest instanceof HttpServletRequest) {
request = new CustomHttpServletRequestWrapper((HttpServletRequest) servletRequest);
}
if (request == null) {
chain.doFilter(servletRequest, servletResponse);
} else {
chain.doFilter(request, servletResponse);
}
}
@Override
public void destroy() {}
}
package com.impl.modelserver.common.config.mvc;
import java.util.Collections;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Description: 过滤器配置
*
* @version 1.0 @ClassName FilterConfiguration @Author xulei
* @date 2021/3/3 16:51
*/
@Configuration
public class FilterConfiguration {
@Bean
FilterRegistrationBean<WebFilter> myFilterFilterRegistrationBean() {
FilterRegistrationBean<WebFilter> bean = new FilterRegistrationBean<>();
bean.setFilter(new WebFilter());
bean.setOrder(-1);
bean.setUrlPatterns(Collections.singletonList("/*"));
return bean;
}
}
4.重写mvc放过静态资源
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
private final Logger logger = LoggerFactory.getLogger(WebMvcConfig.class);
@Autowired private RequestInterceptor requestInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
logger.info("############进入请求拦截器##########");
registry
.addInterceptor(requestInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/swagger-resources/**", "/**.html");
}
}