springboot设置统一响应头——无效?接口无响应?

背景

对接一个关联方系统,我这边需要提供几个接口。对方要求,这些接口有统一的响应格式,并且有统一的响应头。统一的响应头包含如下:

{
  "TT-Encrypt":"noaction",
  "Content-Encoding":"gzip",
  "Request-Trace":"1111rrr454f45f",
  "Date":"Thu, 09 Apr 2021 01:52:28 GMT"
}

统一响应头设置

嗯,需求合理,实现也简单:

filter方式

实现OncePerRequestFilter,然后在doFilterInternal中设置响应头:

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    response.setHeader("TT-Encrypt", "noaction");
    response.setHeader("Request-Trace", "xxxxxxx");
    response.setHeader("Content-Encoding", "gzip");
    response.setHeader("Date", new Date().toString());
    filterChain.doFilter(request, response);
}

注意:这里一定要遭doFilter之前设置,因为在doFilter之后,response的状态已经是committed=true,如果是在doFilter之后设置,结果会正常返回,但是没有设置的header。

image.png

使用过滤器:

@Configuration
public class NbWebMvcConfigurer extends WebMvcConfigurerAdapter {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册自定义的拦截器
        registry.addInterceptor(new HeaderInterceptor());
    }
}

public class HeaderInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 设置Header的响应信息
        response.addHeader("TT-Encrypt", "noaction");
        response.addHeader("Content-Encoding", "gzip");
        response.addHeader("Request-Trace", NbCheckListContextHelper.getTraceId());
        response.addHeader("Date", new Date().toString());
        return true;
    }
}

注意:在HeaderInterceptor中,一定是preHandle方法中设置,否则也不会生效。同Filter一样的原因。

其他方式

当然也可以使用其他的方式,例如在@RestControllerAdvice中设置也是可以的。但是从代码的设计上来看,不妥!

接口无响应?

其实如果完全按照上述方式进行操作,调用该接口的时候,我们后端不会有问题,但是前端得不到response,提示的错误为:Error: incorrect header check!

image.png

遇到这种情况,首先要明确,按照这种方式设置response的header是肯定可以的。之所以出现这个问题,主要是因为设置的header参数有问题。这里的问题是:response.addHeader("Content-Encoding", "gzip");
在springboot中,开启gzip压缩可以使用配置:这样,响应头中就可以自动添加上response.addHeader("Content-Encoding", "gzip");

server.compression.enabled=true
server.compression.mime-types=application/json

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/322675.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

v-if 实现不同的状态样式

目录 一、实现思路 二、实现步骤 案例一: ①view部分展示 ②JavaScript 内容 ④ 效果展示 案例二: ①view部分展示 ②JavaScript 内容 ④ 效果展示 ​编辑 一、实现思路 通过v-for循环获取数据并进行判断该条记录中status的状态 给不同的状态赋值&am…

FDTD2018a安装问题记录

FDTD2018a安装问题记录 目录问题解决方案 目录 问题 解决方案 电脑名字如果是中文改成英文

【数据结构】C语言实现顺序栈

顺序栈的C语言实现 导言一、栈的分类二、顺序栈2.1 顺序栈的数据类型2.2 顺序栈的初始化2.3 栈的判空2.5 顺序栈的进栈2.6 顺序栈的出栈2.7 顺序栈的查找2.8 顺序栈的另一种实现方式2.9 顺序栈的销毁 结语 导言 大家好,很高兴又和大家见面啦!&#xff0…

【数学建模美赛M奖速成系列】数据可视化(二)

数据可视化(二) 写在前面百分比堆叠线条图优点缺点实现pythonmatlab 火山图优点实现pythonmatlab 最后 写在前面 上一篇文章为大家分享了山脊图和气泡图的绘图方法与代码,这里学姐为继续为大家分享百分比堆叠线条图和火山图,包含…

Linux下的HTTPS配置:从证书到安全连接

在当今的互联网环境中,数据传输的安全性越来越受到重视。HTTPS,作为HTTP的安全版本,通过使用SSL/TLS协议来加密数据传输,确保了数据在传输过程中的安全。在Linux环境下,配置HTTPS需要从证书的生成到服务器的配置进行一…

RT-Thread入门笔记3-线程的创建

线程 RT-Thread 中,线程由三部分组成:线程代码(入口函数)、线程控制块、线程堆栈. 线程代码: 线程控制块 : 线程控制块是操作系统用于管理线程的一个数据结构, 它会存放线程的一些信息, 例如优先级、 线程…

[Python练习]使用Python爬虫爬取豆瓣top250的电影的页面源码

1.安装requests第三方库 在终端中输入以下代码(直接在cmd命令提示符中,不需要打开Python) pip install requests -i https://pypi.douban.com/simple/ 从豆瓣网提供的镜像网站下载requests第三方库 pip install requests 是从国外网站下…

为何劳保鞋现在如此受欢迎,这就是原因!

当代年轻人最大的消费原则,必须是不花半点冤枉钱,伴随着军大衣成为“时尚单品”,硬核劳保鞋也大受欢迎。今天百华小编就与大家一起看看劳保安全鞋为何如此受大众欢迎呢。 首先,随着人们安全意识的提高,对个人安全和健康…

手把手教你学会接口自动化系列十一-将用例写在json中,持久化管理起来下

上一篇我写了登录,我们发现json还是没有什么大问题,还蛮好用的,但是我们再写下一个,比如线索新建接口的时候,我们写着写着会发现问题: 我们写获取url的没有问题,代码如下: # !/usr…

vue:使用【3.0】:拖拽数据

1、参考链接&#xff1a;vue.draggable中文文档 - itxst.com 2、想要实现的效果图&#xff1a;红框内容可以拖拽 3、安装 yarn add vuedraggablenext npm i -S vuedraggablenext 4、代码 <template><draggable:list"columns"ghost-class"ghost&qu…

mac下配置git自定义快捷命令

1. 指定自定义别名 vi ~/.bash_profile open ~/.bash_profile 配置环境变量,插入类似下面的内容 alias gcgit checkout alias gmgit commit -m alias gcbgit checkout -balias gtgit statusalias gagit add .alias glggit logalias gdgit diffalias grnmgit rm node_modul…

[python]pyside6安装和在pycharm配置

安装命令&#xff1a; pip install PySide6 -i https://mirror.baidu.com/pypi/simple Pycharm配置Pyside6 打开Pycharm点击File -> Settings -> Tools -> External Tools&#xff0c;点击&#xff0b;。需要添加 Pyside6-Designer 、 Pyside6-UIC 和 Pyside6-rcc三…

新手入门Java 方法带参,方法重载及面向对象和面向过程的区别介绍

第二章 方法带参 课前回顾 1.描述类和对象的关系 类是一组对象的共有特征和行为的描述。对象是类的其中一个具体的成员。 2.如何创建对象 类名 对象名 new 类名();3.如何定义和调用方法 public void 方法名(){}对象名.方法名();4.成员变量和局部变量的区别 成员变量有初…

【MySQL高级】——索引的创建设计原则

1. 索引的声明&使用 <1> 索引分类 功能逻辑 说&#xff0c;索引主要有 4 种&#xff0c;分别是普通索引、唯一索引、主键索引、全文索引。物理实现方式 索引可以分为 2 种&#xff1a;聚簇索引和非聚簇索引。作用字段个数 索引可以分为 2 种&#xff1a;单列索引和…

无迹卡尔曼滤波(Unscented Kalman Filter, UKF):理论和应用

无迹卡尔曼滤波&#xff08;Unscented Kalman Filter, UKF&#xff09;&#xff1a;理论和应用 卡尔曼滤波是一种强大的状态估计方法&#xff0c;广泛应用于控制系统、导航、机器人等领域。然而&#xff0c;传统的卡尔曼滤波假设系统是线性的&#xff0c;而在实际应用中&#…

一篇文章带你了解接口测试(总结)

接口测试是软件测试中的一块重要部分&#xff0c;简言之&#xff0c;接口测试是指验证软件系统中各个模块间接口处的交互是否正确。 接口是软件组件之间交互的协议&#xff0c;允许不同的软件系统或模块通过明确定义的方法通信和交换数据。 一. 接口测试的重要性 在微服务架…

USB-C一线通桌面显示器你有见过么?

新型的TYPE-C接口桌面显示器&#xff0c;宛如一位多才多艺的艺术家&#xff0c;它不仅精于视频传输&#xff0c;更在充电领域展现出无与伦比的才华。不同于传统的显示器&#xff0c;它化平凡为神奇&#xff0c;将显示器的DC电源巧妙地转换成PD协议&#xff0c;为各种设备提供稳…

德思特干货丨如何使用SBench6软件对数字化仪采集信号进行处理?(二)——平均运算功能

来源&#xff1a;德思特测量测试 德思特干货丨如何使用SBench6软件对数字化仪采集信号进行处理&#xff1f;&#xff08;二&#xff09;——平均运算功能 原文链接&#xff1a;https://mp.weixin.qq.com/s/j-iN_2Jrn9ZHGMaaAYsDJg 欢迎关注虹科&#xff0c;为您提供最新资讯&…

从静态到动态:视频美颜SDK在短视频平台的应用全面解析

为了在短视频平台上实现更出色的美颜效果&#xff0c;开发者们通常会借助视频美颜SDK。本文将深入探讨视频美颜SDK在短视频平台上的应用&#xff0c;从技术原理、性能优化到用户体验等方面进行全面解析。 一、技术原理与算法演进 视频美颜SDK的核心在于其算法&#xff0c;而…

AIGC ChatGPT 4 Prompt 万能提示词公式

最近大家都在使用ChatGPT来帮助自己完成相应的工作。很多时候大家提出的问题得不到很清晰,很明确的答案。 我们应该怎么样来和ChatGPT进行有效的沟通呢? 例如我们先来问一问ChatGPT: 要获得最准确的回复,请确保遵循以下建议: 明确性:请尽量明确描述您的问题。确保提供足…