改变Resin-2.1.17返回的server版本信息

来源:互联网 发布:广告软件 编辑:程序博客网 时间:2024/05/16 17:58
  这个问题头疼很久了,怎么搜索都搜不到答案,论坛和QQ群问也没人知道。
    艹!!!!!!!!!!!!!!!!!!!!!!!!!
    网上偶尔几个关于这方面的问题的都是讲resin3及以后的,2和配置文件与3格式完全不同,根本套用不上。 
    艹!!!!!!!!!!!!!!!!!!!!!!!!!
    网上搜了个2.1.17版本的安装包,测试了好多次也没搞定。今天下狠心翻翻安装包里的源码 。经过检索后,在response.c里找到了一个设置http头部属性的方法,然后从这里上溯,在jni_vfs.c里找到了下面一行:
    jniClass = (*env)->FindClass(env, "com/caucho/server/http/JniStream"); 
  很明显,这里必然存在一个JniStream.class文件。然后在resin文件夹下的lib中翻了翻,在resin.jar里找到了这个文件。反编译了出来,然后又上溯上溯...,终于在HttpResponse找到了相关的设置。大概看了看代码,比较蛋疼的是,在发送请求前,它会检查头部是不是存在server,如果不存在,就把它的resinServerBytes属性添加上去。它的resinServerBytes属性定义是这样的:
    static byte[] resinServerBytes = ("\r\nServer: Resin/" + Version.VERSION).getBytes();
 Version.VERSION是一个常量,它的定义是:
    public static String VERSION = "2.1.17";
    问题就在这了。
    艹!!!!!!!!!!!!!!!!!!!!!!!!!
    我的想法是,改变一下 resinServerBytes 的定义,不显示Resin字段就好,然后就随便改了个test001之类的(方法参考的http://blog.csdn.net/hexin373/article/details/6669813)。改完覆盖到jar包里,替换掉resin服务器目录下的resin.jar后,发现浏览器中看到的server信息的确不见了,但test001字段也没显示出来。原因是忘记加回车符了,用curl命令可以看到test001。

    我想要不就这样处理吧,实在是受够了鸟。

--------------------------------------------------------------------------------2014/2/13--------------------------------------------------------------------

今天想完善下昨天的问题,采用在构造函数中更改resinServerBytes值为空值的方法来解决,用javassist重新修改下,代码如下。

package main;import java.io.IOException;import javassist.CannotCompileException;import javassist.ClassPool;import javassist.CtClass;import javassist.NotFoundException;public class AsistentMain {public static void main(String[] args) throws NotFoundException, CannotCompileException, IOException {ClassPool cp = ClassPool.getDefault();cp.insertClassPath("C:\\Users\\Simon\\Desktop");// 获得类文件名CtClass cc = cp.get("com.caucho.server.http.HttpResponse");javassist.CtConstructor cc2=cc.getDeclaredConstructors()[0];cc2.insertAfter("resinServerBytes=(\"\").getBytes();");cc.writeFile("C:\\Users\\Simon\\Desktop");}}

0 0