2011-03-05 60 views
24

我是新來的Servlet開發,我正在讀一本電子書,並發現我可以使用重定向到一個不同的網頁重定向使用servlet和請求「的setHeader」法不工作

setHeader("Location", "http://www.google.com") 

但這是行不通的,因爲我寫了這個代碼:

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(); 
     } 
    } 
} 

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(); 
     } 
} 

我一直在使用我的程序來獲取網頁的標題是爲下檢查頭

,我得到的輸出爲:

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 

但我沒有從我的瀏覽器重定向到谷歌的網頁。

感謝提前:)

+0

這queztion指定點之後的任何URL源這樣做的另一種方式適用於GET方法的情況。對於POST的情況,以及有關位置標題的一些細微之處,請參閱相關問題http://stackoverflow.com/questions/5043902/whats-the-proper-way-to-set-the-location-header- for-an-http-201-response-in-aj – Raedwald 2013-06-24 23:22:42

回答

21

正如你所看到的,反應仍然HTTP/1.1 200 OK。爲了表示重定向,你需要發回302個狀態碼:

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

謝謝卡薩布蘭卡其實我忘了這麼做。所以謝謝你。 – codeomnitrix 2011-03-05 15:49:27

62

哦,不,不!這不是你重定向的方式。它更簡單:

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"); 
+0

好的,謝謝adarshr。我認爲這很好,但不是我想要的。實際上我試圖使用標題重定向到頁面。但還有另一種發現,這就是爲什麼非常感謝你。 – codeomnitrix 2011-03-05 15:48:38

+10

sendRedirect使用http-header。 HttpServletResponse的實現通常使用.setStatus()和.addHeader()。它甚至使相對URL絕對。所以使用.sendRedirect()代碼更少,更易於閱讀。 :-) – Boris 2011-03-05 16:16:47

+1

+1爲更簡單的重定向代碼。但考慮到該計劃的「Hello World」性質,也許人們可能會更關心分離問題。 – alttag 2016-02-15 18:27:22

-1

如果你想重定向到的時間

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(); 
} 

}