springboot Post 请求拦截Body参数
应用场景
- 想捕获请求发过来的所有参数(包含也许 接收类 不包含的字段)
- 想查看
Feign
远程接口 进行的序列化是否如愿简单问一句,你知道
Feign
接口参数类如果包含一个域 是Class
类型的话,序列化的结果是啥吗?还有如果 Feign 如果传递时间Date
是否会有问题呢?
注意事项
- 记得body里面的参数是储存在 输入流 里的,如果你的拦截器读取了输入流,那么这个输入流就不会再有参数了,即到达
Controller
的参数为空的
代码
拦截器
@Component
public class AuthSecurityInterceptor extends HandlerInterceptorAdapter {
private Logger logger = LoggerFactory.getLogger(AuthSecurityInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
String body = getBody(httpServletRequest);
System.out.println(body);
return true;// true 则继续执行
}
public String getBody(HttpServletRequest request) {
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
InputStream inputStream = null;
try {
inputStream = request.getInputStream();
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
char[] charBuffer = new char[128];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
} else {
stringBuilder.append("");
}
} catch (IOException ex) {
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return stringBuilder.toString();
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
配置类
@Configuration
public class WebSecurityConfig extends WebMvcConfigurerAdapter {
@Bean
public AuthSecurityInterceptor getSecurityInterceptor() {
return new AuthSecurityInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration addInterceptor = registry.addInterceptor(getSecurityInterceptor());
// 拦截配置
addInterceptor.addPathPatterns("/**");
}
}
参考
做个笔记,以免以后忘记