测试中间件是weblogic8.1.4,jdk 是weblogic 自带的1.42
对于不同的请求方式,需要采取不同的处理方式lin49940
一。GET 方法
1. 可以用request 的 getParameter 方法, getParameterMap 方法和 getParameterValues 方法获取到传递过来的参数和其值,不建议直接用QueryString 。
2. 过滤器filter 里面的 ServletRequest 操作权限是有限的,只可以读,不能改写数据, 如果需要改写参数数据,那么就需要写一个HttpServletRequestWrapper 的子类来实现了。
最起码要覆盖构造方法,getParameter 方法和getParameterValues方法, 修改返回的值。
public String getParameter(String paramName)
public String[] getParameterValues(String paramName)
如果是要添加参数,还需要自定义一个HashMap 对象params,把参数map 放到里面, 重写获取参数的几个方法,把参数的值从params 中取出来。
3. 无法从流中获取任何消息。
1. 可以用request 的 getParameter 方法, getParameterMap 方法和 getParameterValues 方法获取到传递过来的参数和其值,建议用这种方式获取参数。
2. 同时可以从流中获取参数消息,不过流读取一次就没了,所以不建议从流读取,流的数据就跟 GET 方式的QueryString 一样(name1=value1&name2=value2),由于用流的方式,所以上传的数据量是可以说没有限制的,不像GET 有最大2KB 的限制。
3. 过滤器filter 里面的 ServletRequest 操作权限是有限的,只可以读,不能改写数据, 如果需要改写参数数据,那么就需要写一个HttpServletRequestWrapper 的子类来实现了。
最起码要覆盖 构造方法,getParameter 方法和getParameterValues方法, 修改返回的值。
public String getParameter(String paramName)
public String[] getParameterValues(String paramName)
4. 页面或系统没有做好编码设置,可能会遇到中文乱码问题。
三。POST 方法(表单的 enctype 指定为multipart/form-data,一般用于有上传文件的表单)
1. 无法用request 的 getParameter 方法, getParameterMap 方法和 getParameterValues 方法获取到流传递过来的参数和其值,要获取参数和值,就必须写一个HttpServletRequestWrapper 的子类来实现了,保存流,并且要解析流数据。
需要覆盖构造方法,getInputStream 方法 ,getReader,resetInputStream ,getParameter,getParameterMap,getParameterNames,getParameterValues方法。
需要自定义一个 HashMap对象 params,用于从流中读取参数,在构造方法中把参数写入到params 中。
需要自定义一个 byte[] 对象streamBody, 在构造方法里面, 把request 的流写入到streamBody 里面。
需要自定义一个 ServletInputStream 的继承类,把输入流从streamBody 中读取。
建议自定义一个 HashMap 对象fileParms, 专门存放获取的文件表单字段名称和文件名称,可以判断哪些参数保存的是文件内容,当然这种做法也是存在瑕疵的。
自定义一个ArrayList 对象fileList, 把文件名称放进去,用于查询文件名称的合法性。
添加 initBodyStream(HttpServletRequest request),initParams(String body),addParameter(String key,String value) 和 getBodyContent()方法
其中getBodyContent 从流转化为字符串,这个时候是需要考虑字符编码的。
我会在另外一篇博客中专门写这个的实现。
如果只是为了判断参数值的合法性,不建议重写 getParamete****等方法 ,因为在一些不同的框架下,Struts,spring,portal或一些公司自行研发的框架下,他们都充分封装了request 和servlet, 一层一层的filter 中传递的 request, 谁能保证中间某一步的代码写得不好,导致了各种无法预见的bug 呢。
2. 一个特别需要注意的地方
如果你的form 的action 是这样的“/myaction.do?m=add&user=aa”, 那么在getParameter和getParameterMap等方法中,你是可以取到参数m和user 的值得。
所以初始化对象 params 的时候,要先判断params 是否为空,如果不为空,那就是可能已经初始化过了,不需要再次初始化。
不然的话,先 params.putAll(getParameterMap); 把action 里面的QueryString 也添加进来。
3. 还有两个需要覆盖的方法,getParameter 方法和getParameterValues方法,如果不覆盖这两个方法,servlet 的获取数据操作有可能会有部分数据丢失, 实现这两个方法就需要对流数据进行解析了。
这种流的数据格式是遵从 RFC 2045协议
-----------------------------7e11f41d70210
Content-Disposition: form-data; name="textfield"
123
-----------------------------7e11f41d70210
Content-Disposition: form-data; name="textfield"
abc
-----------------------------7e11f41d70210
Content-Disposition: form-data; name="Submit"
Submit
-----------------------------7e11f41d70210--
-----------------------------7e11f41d70210 这是一个每个参数的分隔符,后面的数字字母在不同的请求中
Content-Disposition: form-data; name="textfield" 字段的名称,如果是上传的文件,文件名跟在后面
如果是文件,下一行是content-type
然后空一行,然后就是值得内容了
在java 字符串里面,
"\r\n-----------------------------7e11f41d70210\r\nContent-Disposition: form-data; name=\"textfield\"\r\n\r\n123\r\n-----------------------------7e11f41d70210--"
先获取分隔符,然后用分隔符split 出所有参数字段信息,然后再获取name,在name后面的 \r\n\r\n值\r\n, 值得位置很容易获取,2个回车的位置 到 信息的长度减去2的位置就是值了,注意\r\n 是2个字符长度。
Content-Disposition: form-data; name="file"; filename="00000000.xls"
四。POST 其他的方式,非原生的,一些新主流浏览器也是支持的,但是会有部分浏览器不支持
1. content type 为 application/json,AJAX 这个大家应该不陌生吧,这个带来了WEB 开发的一个重大变革,JSON 格式是后面才开始流行,JSON 格式提供比Map 的key-value 更为复杂的数据结构, 并且这种数据结构的构成很开放,JSON 格式提供比 XML 格式简洁很多,并且JSON 格式的数据读写超级方便。
2. content type 为 text/xml,很多时候用于 webservice 服务的,使用标准的XML 格式传递数据。