• 【SpringMVC】_设置响应状态码与Header


    目录

    1. 设置响应状态码

    2. 设置响应Header

    2.1 设置Content-Type

    2.1.1 不使用@RequestMapping的produce属性

    2.1.2 使用@RequestMapping的produce属性

    2.2 设置/新增其他Header


    1. 设置响应状态码

    Spring是基于servlet实现的,设置HTTP响应的状态码可以通过servlet实现:

    具体而言,是通过Spring MVC的内置对象HttpServletResponse提供的方法进行设置

    .java文件内容如下:

    1. package com.example.demo.controller;
    2. import com.example.demo.Person;
    3. import org.springframework.stereotype.Controller;
    4. import org.springframework.web.bind.annotation.RequestMapping;
    5. import org.springframework.web.bind.annotation.ResponseBody;
    6. import org.springframework.web.bind.annotation.RestController;
    7. import javax.servlet.http.HttpServletResponse;
    8. @RequestMapping("/return")
    9. @Controller
    10. public class ReturnController {
    11. @ResponseBody
    12. @RequestMapping("/setStatus")
    13. public String setStatus(HttpServletResponse response){
    14. response.setStatus(401); //401状态码通常表示未登录
    15. return "Set a status.";
    16. }
    17. }

    启动运行类,根据路径进行访问,页面如下:

    注:状态码不影响页面的显示

    按照状态码的含义而言,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文件内容如下:

    1. package com.example.demo.controller;
    2. import com.example.demo.Person;
    3. import org.springframework.stereotype.Controller;
    4. import org.springframework.web.bind.annotation.RequestMapping;
    5. import org.springframework.web.bind.annotation.ResponseBody;
    6. import org.springframework.web.bind.annotation.RestController;
    7. @RequestMapping("/return")
    8. @Controller
    9. public class ReturnController {
    10. @ResponseBody
    11. @RequestMapping(value = "r1")
    12. public String r1(){
    13. return "{'OK': 1}";
    14. }
    15. }

    运行启动类,根据URL进行页面访问:

    可见当仅使用@RequestMapping注解的模型属性(value)时,当接口类型为String时(方法返回类型为String),页面会被解析为html格式:

    也可以使用Fiddler抓包查看响应的Content-Type类型:

    2.1.2 使用@RequestMapping的produce属性

    .java文件内容如下:

    1. package com.example.demo.controller;
    2. import com.example.demo.Person;
    3. import org.springframework.stereotype.Controller;
    4. import org.springframework.web.bind.annotation.RequestMapping;
    5. import org.springframework.web.bind.annotation.ResponseBody;
    6. import org.springframework.web.bind.annotation.RestController;
    7. @RequestMapping("/return")
    8. @Controller
    9. public class ReturnController {
    10. @ResponseBody
    11. @RequestMapping(value = "r1", produces = "application/json")
    12. public String r1(){
    13. return "{'OK': 1}";
    14. }
    15. }

    使用Fiddler抓包查看此时的HTTP响应:

    通过这种方式实现Content-Type的类型很少使用,

    一方面,当返回的值与设置的属性值不匹配时会设置失败;

    另一方面,完全可以修改接口类型来实现这种目的,比如使用对象或Map,无需生硬地使用这种方式。

    2.2 设置/新增其他Header

    除了设置Content-Type外,还可以设置/新增其他Header:

    仅简单举例(基于上例代码):

    .java文件内容如下:

    1. package com.example.demo.controller;
    2. import com.example.demo.Person;
    3. import org.springframework.stereotype.Controller;
    4. import org.springframework.web.bind.annotation.RequestMapping;
    5. import org.springframework.web.bind.annotation.ResponseBody;
    6. import org.springframework.web.bind.annotation.RestController;
    7. import javax.servlet.http.HttpServletResponse;
    8. @RequestMapping("/return")
    9. @Controller
    10. public class ReturnController {
    11. @ResponseBody
    12. @RequestMapping(value = "r1", produces = "application/json")
    13. public String r1(HttpServletResponse response){
    14. response.setHeader("myHeader","myHeaderValue");
    15. return "{'OK': 1}";
    16. }
    17. }

    使用Fiddler抓包详情如下:

    可见HTTP响应中已经成功设置了对应Header;

  • 相关阅读:
    flex布局 H5携程移动端头部个人中心和图标 (三)
    原型制作的软件 Experience Design mac( XD ) 中文版软件特色
    创建Secret(使用kubectl)
    白话讲解创建型设计模式:单例、原型,构建
    1.初识爬虫
    vue3中如何实现通过点击不同的按钮切换不同的页面
    HTML二识
    猿创征文|【云原生 | 24】Docker运行数据库实战之MongoDB
    水电站生态流量下泄监测解决方案
    EcmaScript6全新语法特性-----EcmaScript6
  • 原文地址:https://blog.csdn.net/m0_63299495/article/details/139323725