2009年2月24日星期二

Java实现重定向并编辑Http请求的方案小结

最近在做一个WEB应用,其中一个问题是:把客户端递交到servlet上的请求,经过编辑 后转发给另一个服务器上的servlet.

Sample :
- 比方原请求为 http://abcdefg?id=1&name=oyxx
- 现在希望根据服务器上掌握的密码,编辑请求后送往 SJTU
- 直接让客户端发送请求 http://www.sjtu.edu.cn/****?id=1&name=oyxx&pswd=*** 会被拒掉,而且通过 GET 方法明文发送请求也不安全,可能需要改成 POST 方法

Fact :
- 客户端(FireFox, IE ...)只能向网页所属服务器提交HttpRequest,因此重定向不可避免
- javax.servlet.http.HttpServlet 的两个方法,doGet 与 doPost ,参数都是HttpServeletRequest与HttpServeletResponse,没有找到类似 setXXX 的方法可供修改请求参数,唯一可以被设置的是HttpSession的属性,原以为是个救命稻草,后来发现它的本来面目其实是客户端与服务端交互的cookie
- JDK提供的HttpURLConnection有点Old有点弱,参数设置麻烦不说,还需要解析转发服务器返回的响应,再把结果作为相应返回给客户端

Backup :
- 如果仅仅是重定向而不需要更改请求信息,Servlet中,javax.servlet.RequestDispatcher 接口提供的两个方法 include 和 forward 就能解决问题了

Solution :
- Commons-HttpClient ,使用方法可以RTFM :P
- 从来自客户端的请求中读取参数
-- 若以 GET 方法进行重定向,则把编辑过后的请求Query接在重定向目标URL(e.g : http://www.abc.com/servlet_d)后作为 getMethod 构造方法的参数即可
-- 若是 POST 方法,postMethod 构造方法的参数仅是重定向目标的URL,请求参数则通过其 setParameter 方法设置
- 处理来自重定向目标的响应时,调用各自(getMethod/postMethod)的 getResponseBodyAsStream 方法,可以得到包含响应信息的 InputStream,通过正确的编码可以解析为字节流,假如响应返回的是比较流行的 JSON 对象,JSON-lib 提供了从字符串到 JSON Object 再到 JavaBean 的转化

没有评论: