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

目录

[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;

相关推荐
一根稻草君4 分钟前
利用poi写一个工具类导出逐级合并的单元格的Excel(通用)
java·excel
kirito学长-Java6 分钟前
springboot/ssm网上宠物店系统Java代码编写web宠物用品商城项目
java·spring boot·后端
木头没有瓜21 分钟前
ruoyi 请求参数类型不匹配,参数[giftId]要求类型为:‘java.lang.Long‘,但输入值为:‘orderGiftUnionList
android·java·okhttp
奋斗的老史21 分钟前
Spring Retry + Redis Watch实现高并发乐观锁
java·redis·spring
high201123 分钟前
【Java 基础】-- ArrayList 和 Linkedlist
java·开发语言
老马啸西风30 分钟前
NLP 中文拼写检测纠正论文 C-LLM Learn to CSC Errors Character by Character
java
Cosmoshhhyyy1 小时前
LeetCode:3083. 字符串及其反转中是否存在同一子字符串(哈希 Java)
java·leetcode·哈希算法
AI人H哥会Java1 小时前
【Spring】基于XML的Spring容器配置——<bean>标签与属性解析
java·开发语言·spring boot·后端·架构
开心工作室_kaic1 小时前
springboot493基于java的美食信息推荐系统的设计与实现(论文+源码)_kaic
java·开发语言·美食