response.sendRedirect - проверьте, что перенаправление включено - PullRequest
3 голосов
/ 31 мая 2010

Из JSP я просто хочу перенаправить на другую страницу ...

<% response.sendRedirect("http://www.google.com/"); %>

Могу ли я проверить, работает ли google.com, а затем перенаправить (или написать сообщение) ...

Нечто подобное:

<% if(ping("www.google.com")) {
     response.sendRedirect("http://www.google.com/");
} else {
     // write a message 
}%>

Или

<% try {
     response.sendRedirect("http://www.google.com/");
} catch(SomeException e) {
     // write a message 
}%>

Это просто страница JSP, у меня нет доступных библиотек (например, ApacheCommons для методов http GET).

Ответы [ 3 ]

0 голосов
/ 31 мая 2010

ИМХО это не очень хорошая идея. Вы можете написать код Java, который пытается открыть соединение с портом 80 на www.google.com и проверить, получите ли вы код ответа 200. Но имейте в виду, что это замедлит время отображения вашей страницы!

0 голосов
/ 31 мая 2010

В чистом JSP я бы взял JSTL (просто поместите jstl-1.2.jar в /WEB-INF/lib) <c:import> и <c:catch> для этого. <c:import> выбрасывает IOException (FileNotFoundException), когда другая сторона не может быть достигнута. С <c:catch> вы можете поймать любой Throwable в переменную. С <c:choose> (или <c:if>) вы можете обработать результат соответствующим образом.

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="url" value="http://google.com" />
<c:catch var="e">
    <c:import url="${url}" var="ignore"></c:import>
</c:catch>
<c:choose>
    <c:when test="${not empty e}">
        <p>Site doesn't exist
    </c:when>
    <c:otherwise>
        <c:redirect url="${url}" />
    </c:otherwise>
</c:choose>

var="ignore" является обязательным, поскольку в противном случае он будет включать все содержимое страницы в JSP.


Тем не менее, я бы не стал использовать JSP для этого. Предпочитайте HttpServlet или Filter над JSP, если вы хотите контролировать, обрабатывать или обрабатывать запросы. JSP - это технология просмотра и должна использоваться как есть. В HttpServlet я бы сделал больше так:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String url = "http://google.com";
    try {
        new URL(url).openStream(); // Will throw UnknownHostException or FileNotFoundException
        response.sendRedirect(url);
    } catch (IOException e) {
        throw new ServletException("URL " + url + " does not exist", e); // Handle whatever you want. Forward to JSP?
    }
}
0 голосов
/ 31 мая 2010

Вы можете попытаться проверить подключение вашего сервера к цели, как в первом примере, но это заставит поток ждать этого, что, вероятно, нежелательно.

Второй действительно не будет делать то, что вы думаете, он просто отправит HTTP 302 клиенту, и клиент может или не может следовать перенаправлению, но в любом случае вы не получите исключение из него.

...