2014-05-16 4 views
0
다음

가 URL "http://127.0.0.1:8888/Myproject.html?gwt.codesvr=127.0.0.1:9997?_escaped_fragment_=article"를 오픈 한 후 전체 코드내가 입력 한 URL (Crawlable GWT APP)에 상관없이 HTMLUnit이 항상 HostPage를 표시하는 이유는 무엇입니까?

public class CrawlServlet implements Filter{ 
public static String getFullURL(HttpServletRequest request) { 
    StringBuffer requestURL = request.getRequestURL(); 
    String queryString = request.getQueryString(); 


    if (queryString == null) { 
     return requestURL.toString(); 
    } else { 
     return requestURL.append('?').append(queryString).toString(); 
    } 
} 

@Override 
public void destroy() { 
// TODO Auto-generated method stub 

} 

@Override 
public void doFilter(ServletRequest request, ServletResponse response, 
FilterChain chain) throws IOException, ServletException { 

HttpServletRequest httpRequest = (HttpServletRequest) request; 
String fullURLQueryString = getFullURL(httpRequest); 
System.out.println(fullURLQueryString+" what wrong"); 

if ((fullURLQueryString != null) && (fullURLQueryString.contains("_escaped_fragment_"))) { 
    // remember to unescape any %XX characters 
    fullURLQueryString=URLDecoder.decode(fullURLQueryString,"UTF-8"); 
    // rewrite the URL back to the original #! version 
     String url_with_hash_fragment=fullURLQueryString.replace("?_escaped_fragment_=", "#!"); 


     final WebClient webClient = new WebClient(); 

     WebClientOptions options = webClient.getOptions(); 
     options.setCssEnabled(false); 
     options.setThrowExceptionOnScriptError(false); 
     options.setThrowExceptionOnFailingStatusCode(false); 
     options.setJavaScriptEnabled(false); 
     HtmlPage page = webClient.getPage(url_with_hash_fragment); 

     // important! Give the headless browser enough time to execute JavaScript 
     // The exact time to wait may depend on your application. 

     webClient.waitForBackgroundJavaScript(20000); 

     // return the snapshot 
     //String originalHtml=page.getWebResponse().getContentAsString(); 
     //System.out.println(originalHtml+" +++++++++"); 
     System.out.println(page.asXml()+" +++++++++"); 

     PrintWriter out = response.getWriter(); 
     out.println(page.asXml()); 
     //out.println(originalHtml); 
    } else { 
     try { 
     // not an _escaped_fragment_ URL, so move up the chain of servlet (filters) 
     chain.doFilter(request, response); 
     } catch (ServletException e) { 
     System.err.println("Servlet exception caught: " + e); 
     e.printStackTrace(); 
     } 
    } 

} 


@Override 
public void init(FilterConfig arg0) throws ServletException { 
// TODO Auto-generated method stub 

} 


} 

, 그것은이 같은 호스트 페이지 HTML 코드를 보여 주었다 : "http://127.0.0.1:8888/Myproject.html?gwt.codesvr=127.0.0.1:9997#!article을"한편

<html> 

<head> 
<meta name="fragment" content="!"> 
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
<!-- --> 
<!-- 
Consider inlining CSS to reduce the number of requested files 
--> 
<!-- --> 
<link type="text/css" rel="stylesheet" href="MyProject.css"/> 
<!-- --> 
<!-- Any title is fine --> 
<!-- --> 
<title>MyProject</title> 
<!-- --> 
<!-- This script loads your compiled module. --> 
<!-- If you add any GWT meta tags, they must --> 
<!-- be added before this line. --> 
<!-- --> 
<script type="text/javascript" language="javascript" ></script> 
<!-- --> 
<!-- The body can have arbitrary html, or --> 
<!-- you can leave the body empty if you want --> 
<!-- to create a completely dynamic UI. --> 
<!-- --> 
</head> 
<body> 

<div id="loading"> 
Loading 
<br/> 
<img src="../images/loading.gif"/> 
</div> 
<!-- OPTIONAL: include this if you want history support --> 
<iframe src="javascript:''" id="__gwt_historyFrame" tabindex="-1" style="position: absolute; width: 0;height: 0; border:0;"></iframe> 
<!-- 
RECOMMENDED if your web app will not function without JavaScript enabled 
--> 
<noscript> 

<div style="width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1pxsolid red; padding: 4px; font-family: sans-serif;"> 
Your web browser must have JavaScript enabled in order for this application to display correctly. 
</div> 
</noscript> 
</body> 
</html> 

을 확인 작동 & 아무 문제없이 기사를 보여줍니다.

나는 또한 전체 프로젝트 &을 컴파일하여 Tomcat7에서 실행했지만 동일한 문제가 있습니다. 항상 호스트 페이지의 html을 표시합니다.

참고 : 기사 페이지는 머리글 발표자 안에 포함 된 중첩 된 발표자입니다. 그러나 그것이 헤더 페이지를 보여주지 않았기 때문에 그것이 주된 이유라고 생각하지 않습니다. 이미 gwt.codesvr에 대한 ?을 가지고 있기 때문에 아마도 &_escaped_fragment_=article을 시도

답변

0
먼저

, 대신 ?_escaped_fragment_=article, 그래서 2 ? 5 월 엉망 URL 매개 변수 구문 분석.

둘째, 필터가 gwt.codesvr 매개 변수를 갖는 경우를 처리해야합니다. 필터가 첫 번째 매개 변수 인 것으로 가정합니다 (예 : ?). 나는 here 예제가 어느 쪽이든 작동 함을 믿습니다.

+0

사실이 아닌 이유는 무엇입니까? 왜냐하면 나는 WebClient를 테스트하기 위해 url을 넣기조차했지만 여전히 호스트 페이지를 보여줍니다. url_with_hash_fragment = "http://127.0.0.1:8888/myproject.html?gwt.codesvr=127.0.0.1:9997#!article final WebClient webClient = new WebClient(); – Tum

+0

게다가 나는 프로젝트 & 테스트를" mydomain.com?_escaped_fragment_=article "이라면, 결과는 – Tum

+0

입니다. String url_with_hash_fragment = fullURLQueryString.replace ("& _ escaped_fragment_ = ","#! ");로 변경하면 어쨌든 – Tum