2010-02-18 4 views
1

을 사용하여 JSP 페이지의 외부 URL 콘텐츠가 올바르게로드되는지 확인하는 방법 JSP 페이지의 요소에 외부 URL 콘텐츠를로드 할 수있는 솔루션을 찾고 있습니다. 그러나 내용을 표시하기 전에 JSP 코드는 먼저 iframe의 src URL에 포함 된 HTTP 응답을 확인하고 200/OK가 반환 된 경우 그렇지 않으면 표시합니다. 그렇지 않으면 사용자 지정 메시지 또는 다른 페이지가 대신 표시됩니다. 나는 서버 측에서만 그것을하고 싶다.HTTP 응답 코드

잠재적 인 크로스 브라우저 비 호환성을 가질 수있는 AJAX/사용자 측 스크립팅없이이를 구현할 수 있습니까?

답변

4

당신은 다시 JSTL에게 c:catch 태그를 사용하여 사로 잡았 할 수있는 URL이 잘못된 경우 FileNotFoundException을 던질 것이다 외부 자원을 가져올 c:import 태그를 (단지 /WEB-INF/lib에서 jstl-1.2.jar 드롭) JSTL를 사용할 수있다. 마지막으로 JSTL c:choose을 사용하여 iframe 또는 최종 오류를 표시할지 여부를 확인할 수 있습니다.

여기 (JSTL가 설치된)를 copy'n'paste'n'run, SSCCE의 : http://google.com/foo 또는 유효하지 않은 뭔가

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 

<!doctype html> 
<html lang="en"> 
    <head> 
     <title>SO question 2291085</title> 
    </head> 
    <body> 
     <c:set var="url" value="http://google.com" /> 
     <c:catch var="e"> 
      <c:import url="${url}" varReader="ignore" /> 
     </c:catch> 
     <c:choose> 
      <c:when test="${empty e}"> 
       <iframe src="${url}"></iframe> 
      </c:when> 
      <c:otherwise> 
       <p>Error! ${e}</p> 
      </c:otherwise> 
     </c:choose> 
    </body> 
</html> 

변경 http://google.com을, 당신은 오류가 대신으로 표시하는 것을 볼 수 있습니다.

버퍼가 있지만 읽지 않도록하기 위해 varReader="ignore"을 사용 했으므로 동일한 URL을 두 번 요청했기 때문에 비용이 많이 들지는 않습니다.

업데이트는 : 양자 택일로, 당신은 java.net.URLConnection의 도움으로 doGet() 방법 내부의 요청을 전처리하는 이것에 대한 Servlet를 사용할 수 있습니다. 여기에 킥오프 예제가 있습니다.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    URL url = new URL("http://google.com"); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
    int status = connection.getResponseCode(); // 200 = OK, 404 = Not Found, etc. 

    if (status == 200) { 
     request.setAttribute("url", url); 
    } else { 
     // Do your thing to set custom message or request another page. 
    } 

    request.getRequestDispatcher("/WEB-INF/page.jsp").forward(request, response); 
} 

... 그리고 page.jsp에는 단지 /foo 같은의 url-pattern에 서블릿을지도하고 대신 JSP의 http:/example.com/contexty/foo에 전화

<c:if test="${not empty url}"> 
    <iframe src="${url}"></iframe> 
</c:if> 

같은 것을 가지고있다.

0

의 실제로드는 클라이언트가로드하기 때문에 발생합니다. URL을 검증하는 더 좋은 방법은 JSP를 통해 URL을 포함시키는 것보다 간단하게해야합니다. Java로 수행하거나 전혀하지 마십시오. iframe을 숨기려면 자바 스크립트를 실행하는 "찾을 수 없음"페이지를 서버에 반환하십시오. (자바 스크립트를 사용하지 않고 탐색하는 사람들에게 오류가 표시됩니다.)