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

相关推荐
房开民8 小时前
c++总结
java·开发语言·c++
好大哥呀9 小时前
C++ 多态
java·jvm·c++
毕设源码-赖学姐9 小时前
【开题答辩全过程】以 基于Java的医院器材管理系统的设计与实现为例,包含答辩的问题和答案
java·开发语言
float_com9 小时前
【java常用API】----- Arrays
java·开发语言
LuckyTHP10 小时前
迁移shibboleth java获取shibboleth用户信息
java·开发语言
客卿12310 小时前
数论===质数统计(暴力法,)
java·开发语言
华科易迅10 小时前
Spring 事务(注解)
java·数据库·spring
写代码的小阿帆10 小时前
Web工程结构解析:从MVC分层到DDD领域驱动
java·架构·mvc
东离与糖宝11 小时前
Java 26+Spring Boot 3.5,微服务启动从3秒压到0.8秒
java·人工智能
禹中一只鱼11 小时前
【力扣热题100学习笔记】 - 哈希
java·学习·leetcode·哈希算法