这篇文章主要讲如何从HttpServletRequest中获取params和Header信息,可广泛用于web项目的日志记录等场景。如果你的SpringBoot项目使用的是拦截器,在aop切面中获取request的参数时拿不到的话也可以参考此篇文章
1.maven依赖
//可能使用到的Maven依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.9</version>
</dependency>
2.获取参数和Headers
* 获取GET FORM表单参数
* @param req
* @return
public static String getFormParams(HttpServletRequest req) {
try {
Map<String, Object> map = new HashMap<>(16);
Enumeration paramNames = req.getParameterNames();
while (paramNames.hasMoreElements()) {
String paramName = (String) paramNames.nextElement();
String[] paramValues = req.getParameterValues(paramName);
if (paramValues.length > 0) {
String paramValue = paramValues[0];
if (paramValue.length() != 0) {
map.put(paramName, paramValue);
if (CollectionUtil.isNotEmpty(map)) {
return JSON.toJSONString(map);
} catch (Exception e) {
log.error("参数解析异常,无需理会", e);
return "解析参数异常";
* 获取json body参数
* @param request
* @return
public static String getJsonParams(HttpServletRequest request) {
try {
BufferedReader streamReader = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
String body = IoUtil.read(streamReader);
return body;
} catch (Exception e) {
log.error("获取json形式的参数失败,异常情况如下:", e);
return null;
* 获取request的header
* @param request
* @return
public static Map<String, Object> getRequestHeaders(HttpServletRequest request) {
Map<String, Object> map = new HashMap<>(8);
Enumeration<String> enumeration = request.getHeaderNames();
while (enumeration.hasMoreElements()) {
String name = enumeration.nextElement().toLowerCase();
String value = request.getHeader(name);
map.put(name, value);
return map;
3.处理SpringBoot使用拦截器时,获取参数拿不到结果的问题
由于Springboot的request在经过web解析后是不允许反复解析的,所以在request请求进来的时候,我们给它转换一下,可能用拦截器的同学不想使用过滤器,但为实现这个功能,过滤器还需要使用一下的,新建个过滤器,在过滤器中转换下request
@Slf4j
@Component
@WebFilter(filterName = "RequestWrapperFilter", urlPatterns = {"/*"})
public class RequestWrapperFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
ServletRequest requestWrapper = null;
if (request instanceof HttpServletRequest) {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String methodType = httpRequest.getMethod();
String contentType = httpRequest.getContentType();
if (StringUtils.isNotBlank(contentType)) {
contentType = contentType.toLowerCase();
if (CommonString.POST.compareToIgnoreCase(methodType) == 0
&& StringUtils.isNotBlank(contentType)
&& !contentType.contains("multipart")) {
requestWrapper = new RequestWrapper((HttpServletRequest) request);
if (null == requestWrapper) {
chain.doFilter(request, response);
} else {
chain.doFilter(requestWrapper, response);
@Override
public void destroy() {
经过上边在过滤器中转换后,request的相关参数就可以被正常解析了,即使是程序抛出异常的情况下,也可以获得request中的信息
希望对大家有所帮助