web-dev-qa-db-fra.com

Rediriger une demande à l'aide de servlets et la méthode "setHeader" ne fonctionne pas

Je suis nouveau dans le développement de servlets et je lisais un ebook et j'ai découvert que je pouvais rediriger vers une autre page Web en utilisant

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

Mais cela ne fonctionne pas, car j'ai écrit ce code comme suit:

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

j'ai vérifié les en-têtes en utilisant mon programme pour obtenir les en-têtes de la page Web qui est comme sous:

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

Et je reçois la sortie comme:

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

Mais je n'ai pas été redirigé vers la page de google depuis mon navigateur.

Merci d'avance:)

24
codeomnitrix

Comme vous pouvez le voir, la réponse est toujours HTTP/1.1 200 OK. Pour indiquer une redirection, vous devez renvoyer un code d'état 302:

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

Oh non non! Ce n'est pas comme ça que vous redirigez. C'est beaucoup plus simple:

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

De plus, c'est une mauvaise pratique d'écrire du code HTML dans un servlet. Vous devriez envisager de mettre tout ce balisage dans une JSP et d'appeler la JSP en utilisant:

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

Vous pouvez également essayer ce qui suit,

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