使用java的过滤器filter备忘(get和post)

测试中间件是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. 无法从流中获取任何消息。

二。POST 方法(enctype 非multipart/form-data,不用上传文件的,enctype默认是application/x-www-form-urlencoded)

      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)

     如果是要添加参数,还需要自定义一个HashMap 对象params,把参数map 放到里面, 重写获取参数的几个方法,把参数的值从params 中取出来。

     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 格式传递数据。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值