艹!!!!!!!!!!!!!!!!!!!!!!!!!
網上偶爾幾個關於這方面的問題的都是講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");
}
}