J2EE 通过Filter替换返回页面的内容
来源:互联网 发布:网络春晚2017在线观看 编辑:程序博客网 时间:2024/06/09 22:38
一个历史项目,客户要求改ip,由于系统较为久远,没有源代码,通过反编译后发现ip写死在类中,反编译后的代码基本没法进行修改,分析了代码后,发现与ip相关的内容为返回到页面中的字符串,所以,想到了使用Filter,在Filter中处理这些字符串,觉得可行,便查询了一些资料,试验成功。以下这个类是从网上找到的,试验成功后发现页面已经关了,对原作者表示抱歉的同时表示感谢。
package org.mice.ipchange;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpServletResponseWrapper;public class ResponseWrapper extends HttpServletResponseWrapper {private ByteArrayOutputStream buffer = null;private ServletOutputStream out = null;private PrintWriter writer = null;public ResponseWrapper(HttpServletResponse resp) throws IOException {super(resp);buffer = new ByteArrayOutputStream();// 真正存储数据的流out = new WapperedOutputStream(buffer);writer = new PrintWriter(new OutputStreamWriter(buffer,this.getCharacterEncoding()));}// 重载父类获取outputstream的方法public ServletOutputStream getOutputStream() throws IOException {return out;}// 重载父类获取writer的方法public PrintWriter getWriter() throws UnsupportedEncodingException {return writer;}// 重载父类获取flushBuffer的方法public void flushBuffer() throws IOException {if (out != null) {out.flush();}if (writer != null) {writer.flush();}}public void reset() {buffer.reset();}public byte[] getResponseData() throws IOException {// 将out、writer中的数据强制输出到WapperedResponse的buffer里面,否则取不到数据flushBuffer();return buffer.toByteArray();} //内部类,对ServletOutputStream进行包装 private class WapperedOutputStream extends ServletOutputStream{ private ByteArrayOutputStream bos=null; public WapperedOutputStream(ByteArrayOutputStream stream) throws IOException{ bos=stream; } public void write(int b) throws IOException{ bos.write(b); } } }
编写具体的Filter,内容如下
package org.mice.ipchange;import java.io.IOException;import java.io.PrintWriter;import java.util.Enumeration;import java.util.MissingResourceException;import java.util.ResourceBundle;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class IPChangeFilter implements Filter {public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// 需要设置这个,以防乱码response.setContentType("text/html;charset=GBK");HttpServletRequest httpReq = (HttpServletRequest) request;HttpServletResponse httpResp = (HttpServletResponse) response;ResponseWrapper respWrapper = new ResponseWrapper(httpResp);chain.doFilter(request, respWrapper);// weblogic8不支持response.setCharacterEncoding// response.setCharacterEncoding("GBK");String content = new String(respWrapper.getResponseData());String result = replaceText(content);httpResp.setContentType("text/html;charset=GBK");PrintWriter out = httpResp.getWriter();out.println(result);out.close();}/** * 替换内容 */private String replaceText(String content) {Enumeration enumes = RESOURCE_BUNDLE.getKeys();while (enumes.hasMoreElements()) {String o = enumes.nextElement().toString();content = content.replaceAll(o, RESOURCE_BUNDLE.getString(o));}return content;}// 替换文字的配置文件路径private static final String BUNDLE_NAME = "org.mice.ipchange.ipchange";// 加载配置文件private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);// 获取替换文字public static String getString(String key) {try {return RESOURCE_BUNDLE.getString(key);} catch (MissingResourceException e) {e.printStackTrace();}return key;}public void init(FilterConfig arg0) throws ServletException {// TODO Auto-generated method stub}public void destroy() {// TODO Auto-generated method stub}}最后,在配置文件ipchange.properties中配置好你要替换的键值对就可以了,对了,别忘了在你的web.xml中定义Filter,并使用Filter。
- J2EE 通过Filter替换返回页面的内容
- filter对页面内容敏感词进行替换处理
- filter对页面内容敏感词进行替换处理
- 内容替换filter
- paip.输出内容替换在Apache 过滤器filter的设置
- 通过URL返回请求的内容 C#
- 根据正则 替换字符串内容 并返回替换内容后的字符串
- HTMLParser - 通过Filter访问内容
- 通过网络获取页面返回的数据流
- 通过JSON替换的方式实现app返回数据MOCK
- 从html页面获取纯文本文件替换其中的内容
- 子页面 通过 JS 操作 父页面的内容
- httpmodule通过httpfilter获取返回的网页内容
- servlet中使用HttpServletResponseWrapper截获返回的页面内容
- servlet中使用HttpServletResponseWrapper截获返回的页面内容
- 解决aspx的cs文件返回aspx前台页面内容??
- servlet中使用HttpServletResponseWrapper截获返回的页面内容
- servlet中使用HttpServletResponseWrapper截获返回的页面内容
- 使用JS 校验15或18位身份证的合法性以及得到所属地区,出生日期,性别
- 解决:Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could
- Win7(Windows 7)系统下安装SQL2005(SQL Server 2005)图文教程
- tomcat 会话超时设置
- android中通过自定义xml实现你需要的shape效果 xml属性配置
- J2EE 通过Filter替换返回页面的内容
- 找工作之“二叉搜索树”
- 各模块常用BAPI速查
- EJB到底是什么,真的那么神秘吗??
- Boyer-Moore-Horspool-Sunday 算法
- MySQL命令行导出数据库
- poj 1625 (AC自动机 + dp + 高精度(java) )
- 网络管理服务器多做之过
- 【分享】4月安徽区域微博数据之10W抽取样本