java基於browsermob實現代理服務器

    在日常應用中,我們希望代理服務器可以擁有可以進行定製的能力,比如在瀏覽器透明的情況下修改瀏覽器的請求內容,響應結果,我們可以用browsermob來實現這一功能.

    

      <dependency>
            <groupId>net.lightbody.bmp</groupId>
            <artifactId>browsermob-core</artifactId>
            <version>2.1.5</version>
        </dependency>
        BrowserMobProxy proxy = new BrowserMobProxyServer();
        proxy.start(3022);//設置端口
        proxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT);
        proxy.newHar("har");


        proxy.addRequestFilter(new RequestFilter() {
            @Override
            public HttpResponse filterRequest(HttpRequest request, HttpMessageContents contents, HttpMessageInfo messageInfo) {
                String url = messageInfo.getOriginalUrl();//獲取連接
                if(url.contains("search.json")){//判斷目標請求
                    String s = contents.getTextContents();//獲取post請求的內容
                    s = s.replace("pageSize=9","pageSize=19");//替換內容
                    contents.setTextContents(s);//重新設置內容
                }
                return null;
            }
        });

        proxy.addResponseFilter(new ResponseFilter() {
            @Override
            public void filterResponse(HttpResponse response, HttpMessageContents contents, HttpMessageInfo messageInfo) {
                //獲取結果
                contents.getTextContents();

                //修改內容
                String originalText = "結果";
                if (contents.isText()) {
                    if (contents.getTextContents().equals(originalText)) {
                        contents.setTextContents("新的內容");//修改響應的內容
                    }
                }
            }
        });

    從上面的案例中,我們可以看到,已經實現了修改請求內容,跟獲取修改響應結果。使用的地方舉例,比如我們用selenium或者其他瀏覽器集成的方式去進行數據採集,我們無法修改請求參數,比如列表的長度之類的,此時,我們可以用攔截篡改的方式,像例子中的,把每頁條數變更。另外,我們通常採集的ajax接口,都可以直接用獲取響應內容的形式直接採集,不需要去解析頁面了。好處多多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章