response.sendRedirect - 检查重定向是不是启动

Posted

技术标签:

【中文标题】response.sendRedirect - 检查重定向是不是启动【英文标题】:response.sendRedirect - check redirect is upresponse.sendRedirect - 检查重定向是否启动 【发布时间】:2010-05-31 07:52:14 【问题描述】:

从 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 页面,我没有任何可用的库(例如用于 http GET 方法的 ApacheCommons)。

【问题讨论】:

【参考方案1】:

在纯 JSP 中,我会为此使用 JSTL(只需将 jstl-1.2.jar 放入 /WEB-INF/lib&lt;c:import&gt;&lt;c:catch&gt;。当无法到达另一边时,&lt;c:import&gt; 将抛出 IOException (FileNotFoundException)。使用&lt;c:catch&gt;,您可以将任何Throwable 捕获到变量中。使用&lt;c:choose&gt;(或&lt;c:if&gt;),您可以相应地处理结果。

<%@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。当您想要控制、预处理或后处理请求时,首选 JSP 上方的 HttpServletFilter。 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?
    

【讨论】:

【参考方案2】:

可以尝试检查从您的服务器到目标的连接,就像在您的第一个示例中一样,但它会使线程等待这可能是不可取的。

第二个不会真正做你认为的那样 - 它只是向客户端发送一个 HTTP 302,客户端可能会也可能不会遵循重定向,但无论如何你都不会从中得到异常。

【讨论】:

您可以考虑在单独的线程中或使用 Quartz 计时器任务进行验证,并检查线程上次检查站点是否可用。 是的,这将有助于实现这里的原始目标【参考方案3】:

恕我直言,这样做不是一个好主意。 您可以编写 java 代码尝试在 www.google.com 上打开与端口 80 的连接,并检查您是否收到 200 响应代码。 但请注意,这会减慢您的页面渲染时间!

【讨论】:

以上是关于response.sendRedirect - 检查重定向是不是启动的主要内容,如果未能解决你的问题,请参考以下文章

response.sendRedirect() 和 request.getRequestDispatcher().forward(request,response) 有啥区别 [重复]

response.sendRedirect - 检查重定向是不是启动

response.sendredirect为啥跳转不了

使用 response.sendRedirect() 传递隐藏参数

求jsp中response.sendRedirect()实例;

response.sendRedirect()和request.getRequestDispatcher().forward(request,response)的区别