目录
[1. 设置响应状态码](#1. 设置响应状态码)
[2. 设置响应Header](#2. 设置响应Header)
[2.1 设置Content-Type](#2.1 设置Content-Type)
[2.1.1 不使用@RequestMapping的produce属性](#2.1.1 不使用@RequestMapping的produce属性)
[2.1.2 使用@RequestMapping的produce属性](#2.1.2 使用@RequestMapping的produce属性)
[2.2 设置/新增其他Header](#2.2 设置/新增其他Header)
1. 设置响应状态码
Spring是基于servlet实现的,设置HTTP响应的状态码可以通过servlet实现:
具体而言,是通过Spring MVC的内置对象HttpServletResponse提供的方法进行设置:
.java文件内容如下:
java
package com.example.demo.controller;
import com.example.demo.Person;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
@RequestMapping("/return")
@Controller
public class ReturnController {
@ResponseBody
@RequestMapping("/setStatus")
public String setStatus(HttpServletResponse response){
response.setStatus(401); //401状态码通常表示未登录
return "Set a status.";
}
}
启动运行类,根据路径进行访问,页面如下:
注:状态码不影响页面的显示:
按照状态码的含义而言,401状态码应属于请求错误,但后端设计的响应页面仍然在前端成功显示,这应是状态码为200的结果。
是否存在自相矛盾?
使用Fiddler抓包查看HTTP响应详情:
HTTP响应首行显示:状态码确实为401。
注意状态码与页面的显示无关,此处是指HTTP状态码。
2. 设置响应Header
设置响应的Header在开发中并不常见,大多数数据都可以通过其他方式如body部分进行传递。
但在某些场合如鉴权时可能会涉及到Header的设置;
2.1 设置Content-Type
对于@RequestMapping注解:
此处仅做简单了解即可:
可以通过显式指定@RequestMapping的produce属性值来设置响应的返回内容类型;
2.1.1 不使用@RequestMapping的produce属性
在本专栏前文关于返回空JSON时已经提及:
当接口类型为String时,响应的Content-Type会被自动设置为text/html:
.java文件内容如下:
java
package com.example.demo.controller;
import com.example.demo.Person;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/return")
@Controller
public class ReturnController {
@ResponseBody
@RequestMapping(value = "r1")
public String r1(){
return "{'OK': 1}";
}
}
运行启动类,根据URL进行页面访问:
可见当仅使用@RequestMapping注解的模型属性(value)时,当接口类型为String时(方法返回类型为String),页面会被解析为html格式:
也可以使用Fiddler抓包查看响应的Content-Type类型:
2.1.2 使用@RequestMapping的produce属性
.java文件内容如下:
java
package com.example.demo.controller;
import com.example.demo.Person;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/return")
@Controller
public class ReturnController {
@ResponseBody
@RequestMapping(value = "r1", produces = "application/json")
public String r1(){
return "{'OK': 1}";
}
}
使用Fiddler抓包查看此时的HTTP响应:
通过这种方式实现Content-Type的类型很少使用,
一方面,当返回的值与设置的属性值不匹配时会设置失败;
另一方面,完全可以修改接口类型来实现这种目的,比如使用对象或Map,无需生硬地使用这种方式。
2.2 设置/新增其他Header
除了设置Content-Type外,还可以设置/新增其他Header:
仅简单举例(基于上例代码):
.java文件内容如下:
java
package com.example.demo.controller;
import com.example.demo.Person;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
@RequestMapping("/return")
@Controller
public class ReturnController {
@ResponseBody
@RequestMapping(value = "r1", produces = "application/json")
public String r1(HttpServletResponse response){
response.setHeader("myHeader","myHeaderValue");
return "{'OK': 1}";
}
}
使用Fiddler抓包详情如下:
可见HTTP响应中已经成功设置了对应Header;