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

  這個問題頭疼很久了,怎麼搜索都搜不到答案,論壇和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");
	}
}

發佈了37 篇原創文章 · 獲贊 57 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章