request.getParameterMap()的POST为什么获取不到参数?

加文哥 2018-07-18 06:53:57
大神们:
我的框架是springbootboot,用的是过滤器,implements实现Filter的doFilter方法,但是post请求request.getParameterMap()获取不到呢?求解释!
...全文
7087 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
强者秃也 2021-07-30
  • 打赏
  • 举报
回复

哈希塞特
老哥解释的很到位,我这里就提个包装

1.自定义包装

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * @author 
 * @version V1.0
 * @Package com.item.model.common
 * @date 2021/7/26 10:01
 */
public class RequestWrapper extends HttpServletRequestWrapper {
    private final String body;
    public RequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader bufferedReader = null;
        try {
            InputStream 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) {
            throw ex;
        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException ex) {
                    throw ex;
                }
            }
        }
        body = stringBuilder.toString();
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
        ServletInputStream servletInputStream = new ServletInputStream() {
            @Override
            public boolean isFinished() {
                return false;
            }
            @Override
            public boolean isReady() {
                return false;
            }
            @Override
            public void setReadListener(ReadListener readListener) {}
            @Override
            public int read() throws IOException {
                return byteArrayInputStream.read();
            }
        };
        return servletInputStream;

    }
    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new InputStreamReader(this.getInputStream()));
    }
    public String getBody() {
        return this.body;
    }

}

2.filter

@Component
public class HttpServletFilter 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) {
            //包装成自定义的Request, 就可以多次的获取requestBody
            requestWrapper = new RequestWrapper((HttpServletRequest) request);
        }
        if(requestWrapper == null) {
            chain.doFilter(request, response);
        } else {
            chain.doFilter(requestWrapper, response);
        }
    }
    @Override
    public void destroy() {

    }
}

3.filter配置生效

import com.item.model.filter.HttpServletFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author
 * @version V1.0
 * @Package com.item.model.config
 * @date 2021/7/26 10:36
 */
@ServletComponentScan("com.item.model.filter")
@Configuration
public class FilterConfig {

    @Autowired
    private HttpServletFilter httpServletFilter;

    /**
     * 解决requestBody只能读取一次
     * @return
     */
    @Bean
    public FilterRegistrationBean registerAuthFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(httpServletFilter);
        registration.addUrlPatterns("/order/*");
        registration.setName("orderFilter");
        //值越小,Filter越靠前。 但是有时候这个setOrder(1)不一定生效,所以一定要setName
        registration.setOrder(1);
        return registration;
    }

    //如果有多个Filter,再写一个public FilterRegistrationBean registerOtherFilter(){...}即可。
}

BigDan666 2020-12-24
  • 打赏
  • 举报
回复
引用 5 楼 码洪 的回复:
[quote=引用 4 楼 ৢ͡✾雨默º 的回复:][quote=引用 2 楼 java1357924680 的回复:] request.getParameterMap()只能获取Get方式传入的数据。 Post方式传入的数据可以用下面的方式来读取:

	private String getPostData(HttpServletRequest req) throws IOException {

		BufferedReader bufferReaderBody = null;

		try {

			bufferReaderBody = new BufferedReader(req.getReader());
			String postData = bufferReaderBody.readLine();
			
			return postData;
		} catch (IOException e) {

			throw e;

		} finally {

			if (bufferReaderBody != null) {
				bufferReaderBody.close();
			}
		}
	}
★请阅读本人博客的《答题协议
成功解决了我的问题[/quote] 为啥我用了之后还是不行,报错:java.lang.IllegalStateException: getInputStream() has already been called for this request[/quote] 我也是这个问题,我在springsecurity failHandler中处理的,请问咋解决
licjd 2020-08-06
  • 打赏
  • 举报
回复
引用 3 楼 哈希塞特 的回复:
get和post的表单请求是可以获取到参数的,但是post 的原生字符串请求,也就是application/json类型的请求是获取不到的,你需要从流中读取,就是request中getInputStream获取,但是流只能获取一次,如果你在过滤器中读取了流,spring控制器里就接受不到参数了,当然你可以重新包装下request,把参数重新写回包装后的request中
确实,要是在过滤器里面读,在后续业务代码就读不到了
码洪 2020-08-04
  • 打赏
  • 举报
回复
引用 4 楼 ৢ͡✾雨默º 的回复:
[quote=引用 2 楼 java1357924680 的回复:] request.getParameterMap()只能获取Get方式传入的数据。 Post方式传入的数据可以用下面的方式来读取:

	private String getPostData(HttpServletRequest req) throws IOException {

		BufferedReader bufferReaderBody = null;

		try {

			bufferReaderBody = new BufferedReader(req.getReader());
			String postData = bufferReaderBody.readLine();
			
			return postData;
		} catch (IOException e) {

			throw e;

		} finally {

			if (bufferReaderBody != null) {
				bufferReaderBody.close();
			}
		}
	}
★请阅读本人博客的《答题协议
成功解决了我的问题[/quote] 为啥我用了之后还是不行,报错:java.lang.IllegalStateException: getInputStream() has already been called for this request
ৢ͡✾雨默º 2020-03-04
  • 打赏
  • 举报
回复
引用 2 楼 java1357924680 的回复:
request.getParameterMap()只能获取Get方式传入的数据。 Post方式传入的数据可以用下面的方式来读取:

	private String getPostData(HttpServletRequest req) throws IOException {

		BufferedReader bufferReaderBody = null;

		try {

			bufferReaderBody = new BufferedReader(req.getReader());
			String postData = bufferReaderBody.readLine();
			
			return postData;
		} catch (IOException e) {

			throw e;

		} finally {

			if (bufferReaderBody != null) {
				bufferReaderBody.close();
			}
		}
	}
★请阅读本人博客的《答题协议
成功解决了我的问题
哈希塞特 2018-08-11
  • 打赏
  • 举报
回复
get和post的表单请求是可以获取到参数的,但是post 的原生字符串请求,也就是application/json类型的请求是获取不到的,你需要从流中读取,就是request中getInputStream获取,但是流只能获取一次,如果你在过滤器中读取了流,spring控制器里就接受不到参数了,当然你可以重新包装下request,把参数重新写回包装后的request中
java1357924680 2018-07-19
  • 打赏
  • 举报
回复
request.getParameterMap()只能获取Get方式传入的数据。

Post方式传入的数据可以用下面的方式来读取:

private String getPostData(HttpServletRequest req) throws IOException {

BufferedReader bufferReaderBody = null;

try {

bufferReaderBody = new BufferedReader(req.getReader());
String postData = bufferReaderBody.readLine();

return postData;
} catch (IOException e) {

throw e;

} finally {

if (bufferReaderBody != null) {
bufferReaderBody.close();
}
}
}


★请阅读本人博客的《答题协议
  • 打赏
  • 举报
回复
跟你的前端脚本书写方式有关系,
如果是用jquery 的ajax请求发起的post请求,那么注意传参
dataType 不要指定为 application/json ,或者 指定了的前提下 dataType 要设置为html
如:
var option = {
url: '/test/ReadPerson',
type: 'POST',
data:JSON.stringify(person),
dataType: 'html',
contentType: 'application/json',
success: function (result) { alert(result); }
};

参考:http://blog.51cto.com/cnn237111/984466

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧