openplanning

Redirect 301 chuyển hướng vĩnh viễn trong Java Servlet

  1. Redirect 301 là gì?
  2. Redirect 302 và Redirect 301
  3. Ví dụ Redirect 301

1. Redirect 301 là gì?

Redirect 301 hay còn gọi là chuyển hướng vĩnh viễn (redirect permanently) một địa chỉ trang cũ sang một địa chỉ mới. Chẳng hạn một bài viết của bạn hiện tại đang có URL là:
  • http://yourdomain.com/document/123/java-servlet
Và bạn muốn chuyển hẳn nó sang URL mới:
  • https://yourdomain.com/article/123/java-servlet-tutorial
Trong trường hợp đó bạn cần phải xử lý Redirect 301. Khi người dùng truy cập vào địa chỉ cũ nó sẽ bị chuyển hướng sang địa chỉ mới với mã trạng thái 301. Mã trạng thái 301 có ý nghĩa thông báo với trình duyệt của người dùng, cũng có tác dụng thông báo với các bộ máy tìm kiếm như google. Thông thường các bộ máy tìm kiếm của google cần mất một vài ngày để thay thế các link cũ bởi link mới.
Chú ý rằng: redirect 301, sẽ làm giảm thứ hạng của trang web một chút ít, nhưng không đáng kể.
Redirect 301, là cách tốt nếu bạn muốn chuyển toàn bộ một website từ domain cũ sang một domain mới, và cần khoảng thời gian 1 tới 2 tuần bộ máy tìm kiếm của Google thay thế toàn bộ các URL cũ. Và thứ hạng của các trang giảm đi một chút, nhưng không đáng kể.

2. Redirect 302 và Redirect 301

Trong Servlet bạn đã quen thuộc với phương thức response.sendRedirect(). Đây là phương thức chuyển request của người dùng sang một trang mới, nó là Redirect 302 hay còn gọi là chuyển hướng tạm thời.
** Redirect 302
// Chuyển hướng tạm thời (Redirect 302)
response.sendRedirect(newURL);
** Redirect 301
// Chuyển hướng 301.

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

3. Ví dụ Redirect 301

Dưới đây là một project đơn sử dụng Redirect 301.
Class DataUtils là một class tiện ích lấy ra bản đồ (map) giữa các URL cũ và URL mới, bạn có thể lưu trữ các thông tin này trong Database.
DataUtils.java
package org.o7planning.redirect301;

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

public class DataUtils {

	// URL cũ - URL mới.
	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 mô phỏng một trang web của bạn.
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 là một filter kiểm tra các URL gửi tới server, nếu nó là URL cũ, chuyển hướng 301 tới URL mới.
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 gửi đến Server.
		String url = request.getRequestURL().toString();
		System.out.println("Incomming URL = " + url);

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

		// Tìm URL mới.
		String newUrl = redirect301Map.get(url);

		if (newUrl != null) {

			// Chuyển hướng 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 {
	}

}
Chạy ví dụ: