当浏览器访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接受并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的英文为HTTP status Code。
HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型:
HTTP状态码列表:
java中连接跳转的方式有两种:Redirect和Forward
response.sendRedirect("redirect");
用fiddler查看网页获取信息:
http://localhost:7080/test/testd
GET /test/testd HTTP/1.1
Host: localhost:7080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
HTTP/1.1 302
Location: redirect
Content-Length: 0
Date: Mon, 26 Jun 2017 09:15:23 GMT
浏览器手动302后,对 redirect发起请求,一个重定向,浏览器发了2次请求。
默认的response.sendRedirect返回的是302,即使我在上面设置status code最后也返回302。(Tomcat 8.5中测试)
如果想返回301,只能手动设置了:
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
String newLocn = request.getServletContext().getContextPath()+"/redirect";
response.setHeader("Location",newLocn);
1、什么是301转向?什么是301重定向?
301转向(或叫301重定向,301跳转)是当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码的一种,表示本网页永久性转移到另一个地址。
2、什么是302重定向?
302重定向又称之为302代表暂时性转移(Temporarily Moved ),英文名称:302 redirect。 也被认为是暂时重定向(temporary redirect),一条对网站浏览器的指令来显示浏览器被要求显示的不同的URL,当一个网页经历过短期的URL的变化时使用。一个暂时重定向是一种服 务器端的重定向,能够被搜索引擎蜘蛛正确地处理。
3、301重定向与302重定向的区别
302重定向是暂时的重定向,搜索引擎会抓取新的内容而保留旧的网址。因为服务器返回302代码,搜索引擎认为新的网址只是暂时的。
301重定向是永久的重定向,搜索引擎在抓取新内容的同时也将旧的网址替换为重定向之后的网址。
4、为什么302 重定向和网址劫持有关联
从网址A 做一个302 重定向到网址B 时,主机服务器的隐含意思是网址A 随时有可能改主意,重新显示本身的内容或转向其他的地方。大部分的搜索引擎在大部分情况下,当收到302 重定向时,一般只要去抓取目标网址就可以了,也就是说网址B。如果搜索引擎在遇到302 转向时,百分之百的都抓取目标网址B 的话,就不用担心网址URL 劫持了。问题就在于,有的时候搜索引擎,尤其是Google,并不能总是抓取目标网址。
比如说,有的时候A 网址很短,但是它做了一个302 重定向到B 网址,而B 网址是一个很长的乱七八糟的URL 网址,甚至还有可能包含一些问号之类的参数。很自然的,A 网址更加用户友好,而B 网址既难看,又不用户友好。这时Google 很有可能会仍然显示网址A。由于搜索引擎排名算法只是程序而不是人,在遇到302 重定向的时候,并不能像人一样的去准确判定哪一个网址更适当,这就造成了网址URL 劫持的可能性。也就是说,一个不道德的人在他自己的网址A 做一个302 重定向到你的网址B,出于某种原因, Google 搜索结果所显示的仍然是网址A,但是所用的网页内容却是你的网址B 上的内容,这种情况就叫做网址URL 劫持。你辛辛苦苦所写的内容就这样被别人偷走了。
1.异常处理介绍
Spring在web项目中,如果在请求处理时出现异常,那输出会是Servlet响应。这时异常需要以某种方式转换为响应。
Spring将异常转换为响应的方式:
a.特定的Spring异常将自动映射为指定的HTTP状态码;
b.异常上添加@ResponseStatus注解,从而将其映射为某一个HTTP状态码;
c.方法上添加@ExceptionHandler注解,使其处理异常。
2.异常处理代码
1 @RequestMapping("getPathVariable/{id}")
2 public String getPathVariable(
3 @PathVariable("id") String id){
4 if("error".equals(id)){
5 throw new SpittleException();
6 }
7 return "index";
8 }
1 package com.taozhiye.controller;
2
3 import org.springframework.http.HttpStatus;
4 import org.springframework.web.bind.annotation.ResponseStatus;
5
6 @ResponseStatus(
7 // 404
8 value = HttpStatus.NOT_FOUND,
9 reason = "Spittle not found"
10 )
11 public class SpittleException extends RuntimeException {
12
13 }
正常情况下,当id为error时,会报错,这时是500错误,我们可以通过@ResponseStatus注解,映射到404状态码上,进行简单的异常处理。
第二种方法是报相应的异常,直接跳转到错误页面。
1 package com.taozhiye.controller;
2
3 import org.springframework.web.bind.annotation.ControllerAdvice;
4 import org.springframework.web.bind.annotation.ExceptionHandler;
5
6
7
8 @ControllerAdvice
9 public class AppExcepitonHandler {
10
11 @ExceptionHandler(Exception.class)
12 public String deal(){
13 System.out.println("出现异常");
14 return "index";
15 }
16 }
3.重定向传值
1 @RequestMapping("getPathVariable/{id}")
2 public String getPathVariable(
3 @PathVariable("id") String id,
4 Model model,
5 RedirectAttributes model2){
6 if("error".equals(id)){
7 throw new SpittleException();
8 }else if("findAll".equals(id)){
9 /**
10 * 重定向传参数:
11 * 相当于把参数写到session中,
12 * 如果重定向到controller的时候,用@ModelAttribute接收
13 * 如果重定向到页面,可以直接接收
14 */
15 model2.addFlashAttribute("flash", "flash");
16 /**
17 * 通过url模板进行重定向
18 */
19 return "redirect:/{id}";
20 }else if("index".equals(id)){
21 // model.addAttribute("id", id);
22 /**
23 * 转发不可以使用模板
24 */
25 // return "/{id}";
26 model2.addFlashAttribute("flash", "flash");
27 /**
28 * 通过url模板进行重定向
29 */
30 return "index";
31 }else{
32 return "ajax1";
33 }
34 }
@RequestMapping("/findAll")
@ResponseBody
public List findAll(@ModelAttribute("flash") String flash){
System.out.println("flash:"+flash);
return userService.findUserAll();
}
@RequestMapping("/index")
@ResponseBody
public List index(Map map,@ModelAttribute("flash")String flash){
System.out.println("flash:"+flash);
return userService.findUserAll();
}
重定向传参数:
相当于把参数写到session中,
如果重定向到controller的时候,用@ModelAttribute接收
如果重定向到页面,可以直接接收