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

相关推荐
love is sour3 分钟前
深入浅出 jmap:Java 内存分析的“显微镜“
java·开发语言·测试工具·性能优化
想用offer打牌5 分钟前
虚拟内存与寻址方式解析(面试版)
java·后端·面试·系统架构
代码or搬砖7 分钟前
SQL核心语法总结:从基础操作到高级窗口函数
java·数据库·sql
月明长歌13 分钟前
【码道初阶】【Leetcode94&144&145】二叉树的前中后序遍历(非递归版):显式调用栈的优雅实现
java·数据结构·windows·算法·leetcode·二叉树
杰克尼33 分钟前
蓝桥云课-5. 花灯调整【算法赛】
java·开发语言·算法
wanghowie35 分钟前
01.02 Java基础篇|核心数据结构速查
java·开发语言·数据结构
乂爻yiyao39 分钟前
java并发演进图
java
java1234_小锋40 分钟前
Redis6为什么引入了多线程?
java·redis
9号达人44 分钟前
支付成功订单却没了?MyBatis连接池的坑我踩了
java·后端·面试
看见繁华1 小时前
C++ 设计模式&设计原则
java·c++·设计模式