【问题标题】: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)。

【问题讨论】:

    标签: java jsp redirect response


    【解决方案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 响应代码。 但请注意,这会减慢您的页面渲染时间!

      【讨论】:

        猜你喜欢
        • 2013-01-17
        • 2019-06-03
        • 1970-01-01
        • 2010-11-13
        • 2010-10-31
        • 1970-01-01
        • 1970-01-01
        • 2012-06-16
        • 2012-02-04
        相关资源
        最近更新 更多