标签:
老大给了一个很实际的需求:有段程序,使用Http的方式与合作商交互,而且是明文传输数据。我方的代码已经打包放在服务器上运行了很长时间,这时合作商突然要求修改数据传输的方式,要求加密后再传输,而我方的原有的代码不能改变,以防止引发其它问题。
问:如何在不修改我方现有的代码的前提下,满足合作商的要求?
可能大家都想到了,只要加上一个过滤器Filter不就可以了吗?事实就是这样的,采用Filter+HttpServletRequestWrapper就可以解决这个问题。
首先:在filter中拦截到加密后的请求,将参数解密,然后组装成一个新的明文请求串。
然后:重写HttpServletRequestWrapper中的getInputStream()方法,让其返回过滤器解析后的明文串即可。
具体代码解释如下。
首先我写了两个一摸一样的servlet,一个用来直接接收合作商的明文请求并打印;一个用来接收Filter处理后的合作商的请求并打印(Filter中将合作商加密后的参数解密再传给这个Servlet)。
然后我使用HttpClient模拟了一下合作商发送明文和密文请求的过程,加密使用Base64简单模拟一下。
重点是下面的这个HttpServletRequestWrapper,我重写了它的getInputStream()方法,这个方法返回包含明文的ServletInputStream
最后是简单的Filter,在这里将加密后的ServletRequest重新包装,交给SiServlet进行处理
我的web.xml中是这样配置的
确保过滤器entyptFilter只拦截到SiServlet的请求即可。
运行AdcClient,可以看到下面的结果
这里的重点是MyRequestWrapper中重写的getInputStream()方法。大家可以看看API中关于HttpServletRequest的用法http://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html。
http://lichuanbao.iteye.com/blog/1102138
标签:
原文地址:http://www.cnblogs.com/softidea/p/5903873.html