devstory

Redirection 301, redirection permanente dans Java Servlet

  1. Qu'est-ce que Redirect 301?
  2. Redirect 302 et Redirect 301
  3. Exemple de Redirect 301

1. Qu'est-ce que Redirect 301?

Redirect 301 consiste à rediriger de façon permanente (redirect permanently) une ancienne adresse du site vers une nouvelle adresse de site. Par exemple, votre publication actuelle a l'URL:
  • http://yourdomain.com/document/123/java-servlet
Et vous voulez déplacer définitivement l'ancien lien vers un nouveau URL:
  • https://yourdomain.com/article/123/java-servlet-tutorial
Dans le cas où vous devez traiter de Redirect 301. Lorsque des utilisateurs isitent l'ancienne adresse, il sera redirigé vers un nouveau code 301. Le code d'état 301 doit être informé avec le navigateur des utilisateurs ainsi que le moteur de recherche google. Normalement, le moteur de recherche de google prend quelques jours pour remplacer les anciens liens par les nouveaux.
Remarque: redirect 301 réduira légèrement le classement du site.
Redirect 301, est une bonne façon de vous aider à déplacer un site web complet de l'ancien domaine vers un nouveau domaine, et il faut d'une à deux semaines pour que le moteur de recherche google remplisse toutes les anciennes URL. Et le classement des sites peut diminuer légèrement.

2. Redirect 302 et Redirect 301

Dans Servlet vous êtes familier avec la méthode response.sendRedirect(). C'est la méthode de rediriger la demande d'un utilisateur vers une nouvelle page, elle s'appelle également Redirect 302 ou bien la redirection temporaire.
** Redirect 302
// Temporary Redirect (Redirect 302)
response.sendRedirect(newURL);
** Redirect 301
// Redirect 301.

response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
response.setHeader("Location", newUrl);

3. Exemple de Redirect 301

Ci-dessous est un projet simple qui utilise de Redirect 301.
La classe DataUtils est une classe utilitaire qui sort de la carte (map) entre les anciennes URL et les nouvelles URL, vous pouvez également stocker et récupérer ces informations à partir de la base de données.
DataUtils.java
package org.o7planning.redirect301;

import java.util.HashMap;
import java.util.Map;

public class DataUtils {

	// Ancien URL - Nouveau URL.
	private static Map<String, String> redirect301Map;

	public static Map<String, String> getRedirect301Map() {

		if (redirect301Map == null) {
			redirect301Map = new HashMap<String, String>();

			redirect301Map.put("http://localhost:8080/Redirect301/document/123/java-servlet",
					"http://localhost:8080/Redirect301/article/123/java-servlet-tutorial");

			redirect301Map.put("http://localhost:8080/Redirect301/document/111/java-io-tutorial",
					"http://localhost:8080/Redirect301/article/111/java-io-tutorial");
		}

		return redirect301Map;
	}

}
MyServlet simule une page de votre web.
MyServlet.java
package org.o7planning.redirect301;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/*")
public class MyServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public MyServlet() {
        super();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html");
        String text = "<h2>Hello</h2>"//
                + "You are in URL: <br/>"//
                + "<h3>" + request.getRequestURL() + "</h3>";
       
        response.getWriter().print(text);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}
Redirect301Filter est un filter vérifiant des URL envoyés au serveur, si c'est un ancien URL, il est redigé 301 vers un nouveau URL.
Redirect301Filter.java
package org.o7planning.redirect301;

import java.io.IOException;
import java.util.Map;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebFilter("/*")
public class Redirect301Filter implements Filter {

	public Redirect301Filter() {
	}

	@Override
	public void destroy() {
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
			throws IOException, ServletException {

		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) resp;

		// URL envoie au Serveur.
		String url = request.getRequestURL().toString();
		System.out.println("Incomming URL = " + url);

		Map<String, String> redirect301Map = DataUtils.getRedirect301Map();

		// Cherche un nouveau URL.
		String newUrl = redirect301Map.get(url);

		if (newUrl != null) {

			// Redirige 301 (Redirect 301).
			response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
			response.setHeader("Location", newUrl);
			return;
		}

		chain.doFilter(req, resp);
	}

	@Override
	public void init(FilterConfig fConfig) throws ServletException {
	}

}
Exécutez de l'exemple: