HTTP状态码(重定向/error 301/302)
标签: HTTP Spring web 301302
1. HTTP状态码
当浏览器访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接受并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的英文为HTTP status Code。
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
2. HTTP状态码分类
HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型:
HTTP状态码列表:
3.Java 中Redirect和Forward
java中连接跳转的方式有两种:Redirect和Forward
- (重定向)Redirect
重定向是把request 直接转到其他组件处理,response.sendRedirect()后,response已经提交,不能再对response操作。
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);
4.301/302区别
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 劫持。你辛辛苦苦所写的内容就这样被别人偷走了。
5.异常处理
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<User> findAll(@ModelAttribute("flash") String flash){
System.out.println("flash:"+flash);
return userService.findUserAll();
}
@RequestMapping("/index")
@ResponseBody
public List<User> index(Map<String, Object> map,@ModelAttribute("flash")String flash){
System.out.println("flash:"+flash);
return userService.findUserAll();
}
重定向传参数:
相当于把参数写到session中,
如果重定向到controller的时候,用@ModelAttribute接收
如果重定向到页面,可以直接接收
智能推荐
2020年7月程序员工资统计,平均14357元,又跌了,扎心
点击上方 好好学java ,选择 星标 公众号 来源:csdn 连接:https://blog.csdn.net/juwikuang/article/details/107072931?utm_source=app 平均工资 2020年7月全国招收程序员288685人。2020年7月全国程序员平均工资14357元。上个月是14404,又跌了50元。一顿午饭跌...
Merge K Sorted List Leetcode #23 题解[C++]
题目来源 https://leetcode.com/problems/merge-k-sorted-lists/description/ 题目描述 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. Example: Input: [ 1->4-&...
ubuntu14.04安装SSH服务及配置
ubuntu14.04安装SSH服务及配置 1、安装SSH服务 2、安装完服务后,查看ssh服务是否启动 如果有sshd服务,说明已启动,如图: 如果没有sshd服务,说明未启动,执行以下命令启动: 3、配置ssh服务 4、重启ssh 5、验证ssh登录 打开FlashFXP连接ubuntu,输入ifconfig可以查本地的IP,如图,已连上:...
【了解6大原则,23 种设计模式(一)】
前言 了解设计模式的朋友们,想必都听说过“六大设计原则”吧。其实最经典的 23 种设计模式中或多或少地都在使用这些设计原则,也就是说,设计模式是站在设计原则的基础之上的,所以我通过查找一些资料,然后也访问了一些分享技术的软件查了这些知识点,希望对大家有帮助。所以在学习设计模式之前,很有必要对这些设计原则先做一下了解 一,下面给大家详细的介绍一下这六个设计原则: (1)单一职...
自定义View学习笔记05—Canvas下操作画布
为什么要有画布操作? 疑问======>>>以默认的坐标系圆点为起点,画一条与X轴呈45°的射线,你会怎么操作? 以常规的数学思路来看,先使用三角函数计算出射线上任一点的坐标,然后调用drawLine即可。 有没有更加简单的方法?这个问题留在本笔记最后来解答。 现在进入操作画布的主题: 1、位移translate(float dx, float dy): 注意:这里的位移...
猜你喜欢
投影纹理
教程 投影纹理 1、投影纹理 将相机矩阵和模型矩阵相乘,最后得到纹理采样坐标: 顶点着色器: 片元着色器: 2、如何确定背面 片元着色器: <全文结束>...
C++ Primer(第五版) 第二章 变量和基本类型
目录 基本内置类型 1. 算术类型 2. 类型转换 3.字面值常量 变量 1. 变量定义 2. 变量声明与定义的关系 3. 标识符 4. 作用域 复合类型 1. 引用 2. 指针 3. 理解复合类型的声明 const限定词 1. const的引用 2. const和指针 3. 顶层const 4. constexpr和表达式 处理类型 1. 类型别名 2.auto类型说明符 3.decltype类...
CTF打卡第一天-BUU-不一样的flag
题目: 把题目提供的二进制文件下载下来,使用pe查壳,发现没有加壳,是一个32位文件: 使用ida打开,先搜索一下字符串,找到一串奇怪的字符串,不知道有什么用,先留着: F5反编译一下main函数: 可以看出有4个选择:上下左右,再加上那串字符串 很像以前做过的迷宫,试一下: 很明显 把1当做墙,把0看做路,解法就是从*到#,根据逻辑1234分别对应上下左右,因此得到222441144222 根据...
人脸检测 + 数据训练 + 人脸识别
准备工作: 安装opencv 安装opencv-contrib 创建文件夹,文件结构为: 一、编写一个基础的人脸识别 二、下载或者使用自己照片当训练素材 照片放在data下面的jm文件夹下面,照片名称是我们后面使用到的ID,命名要规范,后缀要一致。如下: 我10张照片里面选了 1-3为马云的,4-7为普京的,8-10是周杰伦的照片。进行训练识别。 三、编写训练代码: 运行代码后就会生成一个yml文...
HDFS的安全模式与文件权限检验(5)
安全模式 安全模式是HDFS所处的一种特殊状态,在这种状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求。在NameNode主节点启动时,HDFS首先进入安全模式,DataNode在启动的时候会向namenode汇报可用的block等状态,当整个系统达到安全标准时,HDFS自动离开安全模式。...