`
sunqi
  • 浏览: 227738 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Servlet Request的 getInputStream() getReader() getParameter()

 
阅读更多

如果你知道了这三者的区别,请忽略

最近碰到了servlet对入参获取方式的处理问题,因为二方库处理不当,导致了获取不到入参的情况,之前也知道这三个方法不兼容,现简单介绍下

 

 

1、这三个获取入参的方法,是互斥的,也就是使用了其中一个,再使用另外的两,是获取不到数据的

Content-Type multipart/form-data除外,此时getParameter只能获取在url串当中的入参,但getInputStreamgetReader还可以有其中一个获取请求的流数据)

2getInputStream() getReader()只能使用一次,getParameter单线程上可重复使用

 

为什么要这么设计呢?

 

And for good reason. It would require the servlet infrastructure to keep a copy of the input in case the servlet decided to replay reopen. That would be an unwarranted overhead.

减少不必要的资源浪费呗。

 

因此tomcat servlet的输入流父类ServletInputStream以及其实现类CoyoteInputStream等,继承了InputStream,但没重写reset markSupported mark这三方法,因此数据的解析是一次性的,

同样,CoyoteReader,也没有重写父类Reader的这三方法,因此也是一次性读取的,两者最终读取的都是InputBuffer里面封装的字节数据

 

而其他的输入流,比如ByteArrayInputStream,三方法重写了,组合使用后数据是可重复读取的,里面可以设置mark标签,前面读取过,后面可以继续读取数据,具体可以写代码测试

 

对于getParameter,也只是其帮我们处理好了数据而已,底层是getInputStream读取了数据,然后解析出来而已,可查看org.apache.catalina.connector.Request  org.apache.tomcat.util.http.Parameters的实现,tomcat7.0.47采用了LinkedHashMap存储了解析出来后的入参(老版本基于hashtable),当第一次getParameter时,会解析所有的入参放如这个mapprocessParameters方法),后面的get直接从map里面获取,他里面只有用parametersParsed didQueryParameters这两标记判断是否已经解析过,所以如果要多线程getParameter,结果你懂得,但同一个线程上NgetParameter肯定没问题,因为后面都只是mapget操作,至于getParameterNames,getParameterValues,getParameterMap这些方法,只是从map里面捞数据而已

 

如果要避免冲突,有两个方案

1、坚决只使用其中一种办法去获取入参,就如坚决维护一党专政一样

 

2、重写request里面的这三个方法,把数据保持住,后面可以随便使,要修改兼容的方法很多,风险比较大,当然这也违背了最初的设计初衷

分享到:
评论

相关推荐

    浅谈图片上传利用request.getInputStream()获取文件流时遇到的问题

    下面小编就为大家带来一篇浅谈图片上传利用request.getInputStream()获取文件流时遇到的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    浅谈request.getinputstream只能读取一次的问题

    下面小编就为大家带来一篇浅谈request.getinputstream只能读取一次的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    servlet2.4doc

    A filter is an object that performs filtering tasks on either the request to a resource (a servlet or static content), or on the response from a resource, or both. Filters perform filtering in the ...

    postman调试接口工具

    在我们平时开发中,特别是需要与接口打交道时,无论是写接口还是用接口,拿到接口后肯定都得提前测试一下,这样的话就非常需要有一个比较给力的Http请求模拟工具,现在流行的这种工具也挺多的,像火狐浏览器插件-...

    servlet电子书籍 pdf格式

    request.getReader()方法 .......................................................8 request.getParameter(String name)方法,...............................8 request.getContextPath()方法 ...................

    ServletRequest过滤程序

    提供了ServletRequest过滤程序,重新构造对象内容,并有效规避request.getParameter()、request.getInputStream()冲突的问题,同时提供了对跨站脚本攻击XSS和SQL注入的过滤程序。

    J2ME入门教程.10(j2me与Servlet相互通讯)编写和配置Servlet服务端

    ServletInputStream input_Stream = request.getInputStream(); DataInputStream d_Inputstream = new DataInputStream(input_Stream ); String data_MIDlet = d_Inputstream.readUTF(); d_Inputstream.close();...

    图片上传下载

    InputStream is request getInputStream ; 以InputStream输入流为基础 建立一个BufferedReader对象 BufferedReader br new BufferedReader new InputStreamReader is ; String buffer null; 循环读取请求...

    JAVA程序员面试题

    这既包括 servlet 又包括被编译成 servlet 的 JSP 页面 request是是代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件(由于 forward 指令和 include 动作的关系) ...

    jspblog项目

    ServletInputStream sis=request.getInputStream(); int len=request.getContentLength(); int index=0; String tmp=null; boolean isFirst=true; String firstLine=null; int [] iindex=new ...

    jsp内置对象的用法

    6 ServletInputStream getInputStream() 得到请求体中一行的二进制流 7 String getParameter(String name) 返回name指定参数的参数值 8 Enumeration getParameterNames() 返回可用参数名的枚举 9 String[] ...

    Servlet实现文件上传的三种方法总结

    1. 通过getInputStream()取得上传文件。 /** * To change this template, choose Tools | Templates * and open the template in the editor. */ package net.individuals.web.servlet; import java.io....

    ognl源码包值得用一用

    InputStream in = item.getInputStream(); // 写入内存缓冲区 byte[] buf = new byte[1024]; int length = 0; while ((length = in.read(buf)) > 0) { os.write(buf, 0, length); ...

    JSF文件上传

    InputStream in = new BufferedInputStream(myFile.getInputStream()); try { byte[] buffer = new byte[64 * 1024]; FileOutputStream fileOutputStream = new FileOutputStream( "C:\\My Files\\tst.jpg");// ...

    java 面试题 总结

    redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。 20、EJB与JAVA BEAN的区别? Java Bean 是可复用...

    基于JAVA的聊天系统的设计与实现

    ois=new ObjectInputStream(s.getInputStream()); oos=new ObjectOutputStream(s.getOutputStream()); onlineUser=new OnlineUser(ois,oos); while(true){ Request req=(Request)ois.readObject(); ois.read()...

    超级有影响力霸气的Java面试题大全文档

    redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。 23、EJB与JAVA BEAN的区别?  Java Bean 是可...

    整合的开源头像上传剪裁组件(flash)兼容性好

    ImageInputStream ii = ImageIO.createImageInputStream(getRequest() .getInputStream()); BufferedImage br = ImageIO.read(ii); if (!file1.exists()) { file1.createNewFile(); } // 将BufferedImage变量...

    关于webuploader插件使用过程遇到的小问题

    本文为大家解决webuploader上传插件如何自定义参数的问题,供大家参考,具体内容如下 ...1、接口不需要指明参数,直接用request.getInputStream()二进制的方式来接受上传的文件,但是这里特别注意,需要将webuploader

    JDiy极速开发框架.7z

    JDiy-2.3正式版: (2013-7-4) 优化JDiyAction模块,使其...修复App对象的GetInputStream()方法,使其可以正确获取Request请求的输入流. 程序输出控制台显示的Locale本地化代码段修改,以及建站**台的其它非功能上的更新.

Global site tag (gtag.js) - Google Analytics