解决request.getInputStream()只能读取一次的问题
来源:互联网 发布:g41g42编程方法 编辑:程序博客网 时间:2024/05/16 17:42
request.getInputStream()只能够读取一次,但是在实际的开发中往往需要多次读取。这样就需要我们将流写入进去,提供后续使用。方法可能有很多,
这里提供其中一种!
1:创建HttpHelper类获取流中的数据。
public class HttpHelper { /** * 获取请求Body * @param request * @return */ private static Logger logger = LoggerFactory.getLogger(HttpHelper.class); public static String getBodyString(ServletRequest request) { StringBuilder sb = new StringBuilder(); InputStream inputStream = null; BufferedReader reader = null; try { inputStream = request.getInputStream(); reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8"))); String line = ""; while ((line = reader.readLine()) != null) { sb.append(line); } } catch (IOException e) { logger.warn("getBodyString出现问题!"); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } return sb.toString(); }}2:重写HttpServletRequestWrapper类
public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper { private final byte[] body; public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException { super(request); body = HttpHelper.getBodyString(request).getBytes(Charset.forName("UTF-8")); } @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(getInputStream())); } @Override public ServletInputStream getInputStream() throws IOException { final ByteArrayInputStream bais = new ByteArrayInputStream(body); return new ServletInputStream() { @Override public int read() throws IOException { return bais.read(); } @Override public boolean isFinished() { return false; } @Override public boolean isReady() { return false; } @Override public void setReadListener(ReadListener readListener) { } }; }}3:在过滤器中加入如下代码@Configurationpublic class CorsConfig extends OncePerRequestFilter { protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 防止流读取一次后就没有了, 所以需要将流继续写出去,提供后续使用 ServletRequest requestWrapper = new BodyReaderHttpServletRequestWrapper(request); String json = HttpHelper.getBodyString(requestWrapper); filterChain.doFilter(requestWrapper, response); }}这里一定要注意返回的request必须是我们重写之后的,否则还是会出现问题!
阅读全文
1 0
- 解决request.getInputStream()只能读取一次的问题
- Servlet的Request.getInputStream()只能读取一次问题
- Servlet的Request.getInputStream()只能读取一次问题
- Servlet的Request.getInputStream()只能读取一次
- request.getinputstream只能读取一次
- request.getInputStream()只能获取一次的问题
- request.getInputStream()只能获取一次的问题
- request.getInputStream()只能获取一次的问题
- 解决request.getParameter() 、 request.getInputStream()和request.getReader()只能使用一次的问题
- 关于request.getinputStream读取一次的问题研究
- 拦截器中,request中getReader()和getInputStream()只能调用一次,构建可重复读取inputStream的request.
- Request.getInputStream()读取数据遇到的问题
- request.getInputStream()读取post传递的xml文件问题
- HttpServetRequest读取body只能一次的问题
- ServletRequest中getReader()和getInputStream()只能调用一次的解决办法
- 解决Content-Type :application/x-www-form-urlencoded 老是request.getInputStream()取不到值的问题
- 有关inputstream流只能读取一次的问题
- 您一次只能安装一种 Adobe 产品问题的解决
- Java8 lambda表达式10个示例
- OpenResy连接MySQL
- Gihub上参与开源项目
- Python标准库(非常经典的各种模块介绍)
- JAVA语言基础实战-吃货联盟订餐系统
- 解决request.getInputStream()只能读取一次的问题
- pycharm快捷键、常用设置、配置管理
- SQL语句
- API学习String字符串
- 2017百度之星资格赛:1002. 度度熊的王国战略
- 统计字符串中有多少空格,数字,字母
- Python函数
- rtpsession详解
- Java递归实现算24