Web响应重定向301与302:
301与302的作用:
301与302都是请求的重定向。状态行设置在响应行中,重定向地址设置在响应头部。请求方获取到响应报文后完成请求的重定向。
301与302的区别:
301表示永久重定向,浏览器在第一次获取到301响应报文就会把报文缓存到浏览器,下次同样请求会直接从缓存中获取响应,不再访问后台服务器。302表示暂时重定向,浏览器获取到302响应报文后不会把报文缓存到浏览器,之后每次请求都会请求后台服务器。
301响应报文如下:
302响应报文如下:
301与302的使用:
SpringMVC下,设置重定向301与302都是对状态行与响应头部的的设置。不过SpringMVC倾向使用302,在HttpServletResponse类中定义了sendRedirect方法封装了301的状态行与响应头部的的设置。执行结果显示301响应的请求只经过后台服务器一次,而302响应的请求发生几次即访问后台服务器几次。
控制器代码:
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Slf4j
@RestController
@RequestMapping("demo")
public class RedirectObjectController {
int sum301=0;
int sum302=0;
@RequestMapping("/redirectBy301")
public String redirect301(HttpServletResponse httpServletResponse){
log.info("请求301:第{}次开始",++sum301);
httpServletResponse.setStatus(301);
httpServletResponse.setHeader("Location", "https://www.baidu.com");
log.info("请求301:第{}次结束",sum301);
return "链接有效";
}
@RequestMapping("/redirectBy302")
public String redirect302(HttpServletResponse httpServletResponse){
log.info("请求302:第{}次开始",++sum302);
try {
httpServletResponse.sendRedirect("https://www.139.com");
} catch (IOException e) {
e.printStackTrace();
}
log.info("请求302:第{}次结束",sum302);
return "链接有效";
}
}
访问结果: