相关文章推荐
飘逸的登山鞋  ·  405 Method Not ...·  1 月前    · 
活泼的高山  ·  Azure REST API ...·  1 月前    · 
跑龙套的青蛙  ·  HTTP headers - HTTP | MDN·  1 月前    · 

这篇文章主要讲如何从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

//系统最好尽早规定,json形式的参数,必须要用Post形式
 * 获取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()) {
        //将key全部转小写
        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;
            //遇到post方法才对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中的信息

希望对大家有所帮助

分类:
后端
  •