【问题标题】:Redirecting a request using servlets and the "setHeader" method not working使用 servlet 重定向请求并且“setHeader”方法不起作用
【发布时间】:2011-07-09 10:52:05
【问题描述】:

我是 servlet 开发的新手,我正在阅读一本电子书,发现我可以使用

重定向到不同的网页
setHeader("Location", "http://www.google.com")

但这不起作用,因为我将这段代码编写为:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ModHelloWorld extends HttpServlet{
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{
//              response.addHeader("Location", "http://www.google.com");
                response.setHeader("Location", "http://www.google.com");
                response.setContentType("text/html");
                PrintWriter pw = response.getWriter();
                pw.println("<html><head><title>Modified Hello World</title></head><body>");
                pw.println("<h1>");
                //getInitParameter function reads the contents ot init-param elements.
                pw.println(getInitParameter("message"));
                pw.println("</h1>");
                pw.println("</body></html>");
                pw.close();
        }
}

我已经使用我的程序检查了标题以获取网页的标题,如下所示:

import java.net.*;
import java.io.*;
class getHeaders{
    public static void main(String args[]){
        URL url = null;
        URLConnection urc = null;
        try {
            url = new URL(args[0]);
            urc = url.openConnection();
            for(int i=0 ; ; i++) {
                String name = urc.getHeaderFieldKey(i);
                String value = urc.getHeaderField(i);
                if(name == null && value == null)//both null so end of header
                    break;
                else if(name == null){//first line of header{
                    System.out.println("Server HTTP version, Response code: ");
                    System.out.println(value);
                    System.out.println("ENd of first header field");
                } else {
                    System.out.println("name of header is: " + name + " and its value is : " + value);
                }
            }
        } catch(MalformedURLException e){
            System.out.println("Malformed URL " + e.getMessage());
        } catch(IOException e){
            e.printStackTrace();
        }
    }
}

我得到的输出是:

Server HTTP version, Response code: 
HTTP/1.1 200 OK
ENd of first header field
name of header is: Server and its value is : Apache-Coyote/1.1
name of header is: Location and its value is : http://www.google.com
name of header is: Content-Type and its value is : text/html
name of header is: Content-Length and its value is : 101
name of header is: Date and its value is : Sat, 05 Mar 2011 15:27:29 GMT

但是我的浏览器没有重定向到谷歌的页面。

提前致谢:)

【问题讨论】:

标签: java tomcat servlets header


【解决方案1】:

或者,您可以尝试以下方法,

resp.setStatus(301);
resp.setHeader("Location", "index.jsp");
resp.setHeader("Connection", "close");

【讨论】:

    【解决方案2】:

    如果您想在指定时间点后重定向到任何 url 源,另一种方法

    import javax.servlet.ServletException;
    
    import javax.servlet.http.HttpServlet;
    
    import javax.servlet.http.HttpServletRequest;
    
    import javax.servlet.http.HttpServletResponse;
    
    import java.io.*;
    
    public class MyServlet extends HttpServlet
    
    
    {
    
    public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException
    
    {
    
    response.setContentType("text/html");
    
    PrintWriter pw=response.getWriter();
    
    pw.println("<b><centre>Redirecting to Google<br>");
    
    
    response.setHeader("refresh,"5;https://www.google.com/"); // redirects to url  after 5 seconds
    
    
    pw.close();
    }
    
    }
    

    【讨论】:

      【解决方案3】:

      哦不不!这不是你重定向的方式。它更简单:

      public class ModHelloWorld extends HttpServlet{
          public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{
              response.sendRedirect("http://www.google.com");
          }
      }
      

      此外,在 servlet 中编写 HTML 代码也是一种不好的做法。您应该考虑将所有这些标记放入 JSP 并使用以下方法调用 JSP:

      response.sendRedirect("/path/to/mynewpage.jsp");
      

      【讨论】:

      • 好的,谢谢 adarshr。我认为那很好,但不是我要找的东西。实际上我试图重定向到使用标题的页面。但还是发现了另一种方法,所以非常感谢。
      • sendRedirect 使用 http-header。 HttpServletResponse 的实现通常使用 .setStatus() 和 .addHeader()。它甚至使相对 URL 成为绝对的。所以使用 .sendRedirect() 代码更少,更容易阅读。 :-)
      • +1 用于更简单的重定向代码。但考虑到程序的“Hello World”性质,也许人们可以更温和地处理关注点分离。
      【解决方案4】:

      如您所见,响应仍然是HTTP/1.1 200 OK。要指示重定向,您需要发回 302 状态码:

      response.setStatus(HttpServletResponse.SC_FOUND); // SC_FOUND = 302
      

      【讨论】:

      • 谢谢卡萨布兰卡,其实我忘了这样做。非常感谢。
      猜你喜欢
      • 2016-04-08
      • 2014-11-07
      • 2015-02-28
      • 1970-01-01
      • 2011-02-05
      • 2012-04-24
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多