J2EE通过Filter替换返回页面的内容

一个历史项目,客户要求改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);
        }
    }
}

返回栏目页:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/Java/

编写具体的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。

作者:csdn博客 yueritian

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索servlet
, string
, java filter
, import
, javax
, public
ioException
j2ee filter、kotlin替换java写j2ee、privoxy filter 替换、subs filter 替换不了、j2ee 页面框架,以便于您获取更多的相关知识。

时间: 2024-12-31 06:19:53

J2EE通过Filter替换返回页面的内容的相关文章

AJAX页面参数相同时只返回缓存的内容的解决办法

AJAX页面参数相同时只返回缓存的内容的解决办法 常利用AJAX写一些页面无刷新的内容获取页面,这种方式很快捷也很方便,但其中有一个问题,就是如果两次提交的参数相同时,返回的内容只返回上次获取的内容,如果我们在第一次修改了参数,第二次再次调用却会发现页面根本没有改变.这样的情况是是为AJAX获取时先检查本机缓存,如果本机缓存已有相同内容,则不访问远端服务器.这样的操作倒是可以提高速度和减少服务器压力.但带来的弊端也是显而易见的. 为了解决这个问题.我们必须在获取页加上一个额外的参数.比较简单的方

JS正则表达式替换页面中内容

问题描述 JS正则表达式替换页面中内容 我想用正则表达式替换table中除了标签""<tr class=""template"" ng-repeat=""model in model.child""></td>""里面的ng-model中的内容,将ng-model=""model.*""替换成ng-model="&

android fragment点击返回键实现内容切换?

问题描述 android fragment点击返回键实现内容切换? 我有一个fragment,上有一个button和textview,默认button是隐藏的,通过点击菜单栏上的一个详细信息的按钮,将button显示出来,现在有没有办法通过点击返回键实现返回上一个只有textview的页面??? 解决方案 Fragment本身也有一个类似Activity的后台管理栈,如果要通过点击返回返回上一个fragment,那么需要使得隐藏button和非隐藏button的Fragmet 是两个不同的实例,

PHP实现模仿socket请求返回页面的方法_php技巧

本文实例讲述了PHP实现模仿socket请求返回页面的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <?php  $url = "www.XXXX.com"; //自己做替换  $parse = parse_url($url); //对URL进行解析,返回起组成部分.  $host = $parse['host'];  $path = $parse['path'];  $port = 80;  $timeout = 80;  $fp = @fsockope

utf-8-关于jsp返回页面中文问题

问题描述 关于jsp返回页面中文问题 用filter request.setCharacterEncoding("UTF-8");也不行,filter是好用的,就是有乱码, 是不是eclipse的问题? 解决方案 jsp中框架页面请求中的中文编码问题 解决方案二: 你jsp页面如果编码也是utf-8,并且用了过滤器进行编码拦截转换,那可能是你tomcat默认设置不是utf-8,你可以在网上百度修改tomcat编码的资料. 解决方案三: 貌似看你只是设置了request的编码集,如果还不

js基于cookie方式记住返回页面用法示例_javascript技巧

本文实例讲述了js基于cookie方式记住返回页面的用法.分享给大家供大家参考,具体如下: 首先明确以下概念 ①. 同名的 cookie,不同的 domain 或不同的 path,属不同的 cookie: 同名的 cookie,相同的 domain 且相同的 path,不同的 expires,属同一个 cookie. ②. 不加过期时间的cookie在浏览器关闭后失效 ③ 二级域名cookie可以生效,通过指定domain 于是在js端 document.cookie="back_url=&qu

如何不让页面显示内容?

问题描述 我想弄一个保密的页面,意思就是登录后才能看.我知道用Session来实现.可是判断是否已经登录之后,我就遇到问题了:我只会在Page_Load方法里面让那些没登录的访客用Response.Redirect方法传到另一个地方去.我又觉得把所有东西放到panel里面不大好.有没有简单的方法让那些没登录的访客只用Response.Write方法只给他们显示几个字呢? 解决方案 解决方案二:LZ可以把一个页面的主体内容全部写到一个stringBuilder当中,再在pageload当中进行判断

[ITextSharp 问题]用itextsharp 5.0.6 不知道如何获取PDF页面的内容,当PDF类型为Distiller时

问题描述 大家好:Itextsharp为开源的软件,代码下载地址为:http://sourceforge.net/projects/itextsharp/files/itextsharp/iTextSharp-5.0.6/itextsharp-5.0.6.zip/download如何获取1571PDF的内容通过itextsharp5.0.6来解析,此PDF类型为distiller.PDF全名:1571es.pdf下载地址:http://www.fda.gov/downloads/AboutFDA

C#抓取AJAX页面的内容

原文 C#抓取AJAX页面的内容 现在的网页有相当一部分是采用了AJAX技术,所谓的AJAX技术简单一点讲就是事件驱动吧(当然这种说法可能很不全面),在你提交了URL后,服务器发给你的并不是所有是页面内容,而有一大部分是JS脚本,即用<JAVASCRIPT标签表示的,这其中有些是链接了外部的JS文件,有些是内置的JS脚本,这些脚本是在客户端加载了服务器发回来的源码后才执行的,所以不管是采用C#中的WebClient还是HttpRequest都得不到正确的结果,因为这些脚本是在服务器发送完毕后才执