如果我想使用 Springs Dispatcher Servlet 和 MappingJacksonConverter 签署传出响应,可能的解决方案是什么。
我的目标是在标题中添加正文内容的 md5,以验证响应。
通过阅读响应后我无法访问标题。
有什么建议?
以您想要的方式对其进行签名的解决方案是执行以下操作:
创建一个 servlet Filter
,将对象包装HttpServletResponse
在一个实现中,该实现写入临时ByteArrayOutputStream
文件并且不刷新标头/内容。当从 中Filter
返回时doFilter
,您从 中获取字节,输入ByteArrayOutputStream
它们以计算 MD5 哈希,添加响应标头,然后刷新响应。
您可以编写自己的 Mapping Conventer 类。在我的项目中,我在类路径中使用MappingJackson2HttpMessageConverter
with jackson2
。我将举一个例子来展示如何在修道院响应消息时添加标题。
一、extentsMappingJackson2HttpMessageConverter
类
public class MyMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {
@Override
protected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
outputMessage.getHeaders().add("code", DigestUtils.md5Hex(object.toString()));
// add header before write body content
super.writeInternal(object, outputMessage); // convent whatever you can
}
}
然后将你自己的 Conventer bean 类添加到 Spring-mvc 配置文件中
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="com.xxx.utils.MyMappingJackson2HttpMessageConverter">
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
这是上面的响应标头
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
code: 84fd2e9b2adc2f5be0b53a3ff7f1492b
Transfer-Encoding: chunked
Server: Jetty(7.6.8.v20121106)