Перенаправление 301 Постоянное перенаправление в Java Servlet

1- Что такое Redirect 301?

Redirect 301 или еще называется постоянное перенаправление (redirect permanently)  старого адреса на новый адрес. Например ваша статья в настоящее время имеет URL:
  • http://yourdomain.com/document/123/java-servlet
И вы хотите перенаправить его на новый URL
  • https://yourdomain.com/article/123/java-servlet-tutorial
В этом случае вам нужно процессировать  Redirect 301. Когда пользователь посещает старый адрес, он будет перенаправлен на новый адрес с кодом 301. Код 301 означает сообщение браузеру пользователя, также  может информировать поисковые системы, как Google. Обычно поисковик Google должен потратить несколько дней, чтобы заменить старые ссылки по новые ссылки.
Обратите внимание, что redirect 301 уменьшит немного рейтинг вебсайта, но незначительно
Redirect 301, это хороший способ, если вы хотите перенаправить весь сайт со старого domain на новый domain, и нужно около 1 до 2 недель чтобы поисковик Google заменил все старые URL. И рейтинг сайтов немного опустится, но несущественно.

2- Redirect 302 и Redirect 301

В Servlet вы ознакомились с методом response.sendRedirect(). Это метод который перенаправляет запрос пользователей на новую страницу, это и есть  Redirect 302 или еще называется временным перенаправлением.
** Redirect 302
// Temporary Redirect (Redirect 302)
response.sendRedirect(newURL);
** Redirect 301
// Redirect 301.

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

3- Пример Redirect 301

Ниже является простой проект с использованием Redirect 301.
Класс DataUtils является утилитарным класcом, который получает карту (map​​​​​​​) между старым URL и новым URL, вы можете хранить эту информацию в Database.
DataUtils.java
package org.o7planning.redirect301;

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

public class DataUtils {

	// старый URL - новый 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 симулирует ваш вебсайт.
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- это filter проверяетт URL отправленные на Server, если это старый URL, то перенаправляет 301 на новый 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 отправленный к Server.
		String url = request.getRequestURL().toString();
		System.out.println("Incomming URL = " + url);

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

		// Найти новый URL.
		String newUrl = redirect301Map.get(url);

		if (newUrl != null) {

			// Перенаправление 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 {
	}

}
Запуск примера: