当前位置: 首页 > news >正文

专业开发网站建设哪家好广州seo工资

专业开发网站建设哪家好,广州seo工资,网站免费优化工具,网页设计与网站建设前文通过阅读源码,深入分析了DispatcherServlet及相关组件的工作流程,本文不再阅读源码,介绍一下扩展HttpMessageConverter的方式。 HttpMessageConverter工作方式及扩展方式 前文介绍过,HttpMessageConverter是读写请求体和响应…

前文通过阅读源码,深入分析了DispatcherServlet及相关组件的工作流程,本文不再阅读源码,介绍一下扩展HttpMessageConverter的方式。

HttpMessageConverter工作方式及扩展方式

前文介绍过,HttpMessageConverter是读写请求体和响应体的组件。

RequestResponseBodyMethodProcessor(用于解析请求参数、处理返回值)从内置的HttpMessageConverter查找支持当前请求体、响应体的实例,然后调用read、write来读写数据。

Spring内置的HttpMessageConverter在装配RequestResponseBodyMethodProcessor的时候创建,具体代码在WebMvcConfigurationSupport类addDefaultHttpMessageConverters方法中。

开发者如果要扩展使用自己的HttpMessageConverter实现,可以编写组件实现WebMvcConfigurer接口,在extendMessageConverters方法中注入自己的HttpMessageConverter实现类对象。

自定义HttpMessageConverter

需求描述

系统需要对响应体进行加密、对请求体解密操作。

思路:

  1. 编写类实现HttpMessageConverter接口,read方法中先对请求体解密,之后在做json反序列化
  2. write方法先做json序列化,之后再加密
  3. 通过WebMvcConfigurer注册

编写HttpMessageConverter实现类

public class MyMappingJackson2HttpMessageConverter implements GenericHttpMessageConverter<Object> {private static final String S_KEY = "1234567890123456";private static final String IV_PARAMETER = "abcdefghijklmnop";// 用来做json序列化和反序列化,自己编写代码也可以,此处直接使用MappingJackson2HttpMessageConverter来做private final MappingJackson2HttpMessageConverter jackson2HttpMessageConverter;// 读写字符串private final StringHttpMessageConverter stringHttpMessageConverter;public MyMappingJackson2HttpMessageConverter(MappingJackson2HttpMessageConverter jackson2HttpMessageConverter) {this.jackson2HttpMessageConverter = jackson2HttpMessageConverter;this.stringHttpMessageConverter = new StringHttpMessageConverter(StandardCharsets.UTF_8);}@Overridepublic boolean canRead(Class<?> clazz, MediaType mediaType) {return jackson2HttpMessageConverter.canRead(clazz, mediaType);}@Overridepublic boolean canWrite(Class<?> clazz, MediaType mediaType) {return jackson2HttpMessageConverter.canWrite(clazz, mediaType);}@Overridepublic List<MediaType> getSupportedMediaTypes() {return jackson2HttpMessageConverter.getSupportedMediaTypes();}@Overridepublic Object read(Class<?> clazz, HttpInputMessage inputMessage)throws IOException, HttpMessageNotReadableException {// 读取请求原始字节byte[] bytes = readBytes(inputMessage);// 解密byte[] decryptBytes = AesUtil.decrypt(bytes, S_KEY, IV_PARAMETER);// 封装HttpInputMessage供下面反序列化使用HttpInputMessage in = new MyHttpInputMessage(inputMessage, decryptBytes);// json反序列化return jackson2HttpMessageConverter.read(clazz, in);}@Overridepublic void write(Object o, MediaType contentType, HttpOutputMessage outputMessage)throws IOException, HttpMessageNotWritableException {ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();// json序列化jackson2HttpMessageConverter.write(o, contentType, new MyHttpOutputMessage(outputMessage, byteArrayOutputStream));byte[] bytes = byteArrayOutputStream.toByteArray();// 加密byte[] encryptStr = AesUtil.encrypt(bytes, S_KEY, IV_PARAMETER);// 将响应写出去this.stringHttpMessageConverter.write(new String(encryptStr, StandardCharsets.UTF_8), contentType, outputMessage);}@Overridepublic boolean canRead(Type type, Class<?> contextClass, MediaType mediaType) {return jackson2HttpMessageConverter.canRead(type, contextClass, mediaType);}@Overridepublic Object read(Type type, Class<?> contextClass, HttpInputMessage inputMessage)throws IOException, HttpMessageNotReadableException {byte[] bytes = readBytes(inputMessage);byte[] decryptBytes = AesUtil.decrypt(bytes, S_KEY, IV_PARAMETER);HttpInputMessage in = new MyHttpInputMessage(inputMessage, decryptBytes);return jackson2HttpMessageConverter.read(type, contextClass, in);}@Overridepublic boolean canWrite(Type type, Class<?> clazz, MediaType mediaType) {return jackson2HttpMessageConverter.canWrite(type, clazz, mediaType);}@Overridepublic void write(Object o, Type type, MediaType contentType, HttpOutputMessage outputMessage)throws IOException, HttpMessageNotWritableException {ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();jackson2HttpMessageConverter.write(o, type, contentType, new MyHttpOutputMessage(outputMessage, byteArrayOutputStream));byte[] bytes = byteArrayOutputStream.toByteArray();byte[] encryptStr = AesUtil.encrypt(bytes, S_KEY, IV_PARAMETER);this.stringHttpMessageConverter.write(new String(encryptStr, StandardCharsets.UTF_8), contentType, outputMessage);}private byte[] readBytes(HttpInputMessage inputMessage) throws IOException {long contentLength = inputMessage.getHeaders().getContentLength();ByteArrayOutputStream bos =new ByteArrayOutputStream(contentLength >= 0 ? (int) contentLength : StreamUtils.BUFFER_SIZE);StreamUtils.copy(inputMessage.getBody(), bos);return bos.toByteArray();}private static class MyHttpInputMessage implements HttpInputMessage {private final HttpInputMessage originalHttpInputMessage;private final byte[] buf;public MyHttpInputMessage(HttpInputMessage originalHttpInputMessage, byte[] buf) {this.originalHttpInputMessage = originalHttpInputMessage;this.buf = buf;}@Overridepublic InputStream getBody() throws IOException {return new ByteArrayInputStream(this.buf);}@Overridepublic HttpHeaders getHeaders() {HttpHeaders headers = this.originalHttpInputMessage.getHeaders();headers.setContentLength(this.buf.length);return headers;}}private static class MyHttpOutputMessage implements HttpOutputMessage {private final HttpOutputMessage originalHttpOutputMessage;private final OutputStream outputStream;public MyHttpOutputMessage(HttpOutputMessage originalHttpOutputMessage,OutputStream outputStream) {this.originalHttpOutputMessage = originalHttpOutputMessage;this.outputStream = outputStream;}@Overridepublic OutputStream getBody() throws IOException {return this.outputStream;}@Overridepublic HttpHeaders getHeaders() {return this.originalHttpOutputMessage.getHeaders();}}
}

注入HttpMessageConverter实现类对象

@Component
public class MyWebMvcConfigurer implements WebMvcConfigurer {@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> converters) {MappingJackson2HttpMessageConverter converter = null;for (HttpMessageConverter<?> messageConverter : converters) {if (messageConverter instanceof MappingJackson2HttpMessageConverter) {converter = (MappingJackson2HttpMessageConverter) messageConverter;break;}}if (converter != null) {// 注入MyMappingJackson2HttpMessageConverterMyMappingJackson2HttpMessageConverter myMappingJackson2HttpMessageConverter =new MyMappingJackson2HttpMessageConverter(converter);converters.add(0, myMappingJackson2HttpMessageConverter);}}
}
http://www.ds6.com.cn/news/60242.html

相关文章:

  • 大连做网站需要多少钱湖南长沙疫情最新消息
  • 快速建设网站a站
  • 公司简介模板免费ppt下载成都seo网站qq
  • 移动端h5网站开发框架网站如何优化流程
  • flash网站开发用什么语言上海seo推广
  • 网站用花生壳nas做存储谷歌搜索引擎入口google
  • 瀑布网站模板怎么做推广
  • 水泥公司网站建设电商网站搭建
  • 贸易公司如何做英文网站百度客服系统
  • 佛山网站建设与设计公司小程序seo推广技巧
  • 如何申请网站空间和域名上海网站推广系统
  • 北京网站建设好不好天汽车营销策划方案ppt
  • 织梦网站底部黑链seo线上培训班
  • 郑州哪家做网站好高端网站建设案例
  • 网站名和域名能一样吗外贸网站建设流程
  • 电影网站怎么做的国内十大搜索引擎
  • 做网站的图哪来网上营销是干什么的
  • copyright wordpresssem优化是什么意思
  • 用ssh做的网站公司网站策划宣传
  • 南京润盛建设集团有限公司网站北京seo优化哪家好
  • 网站建设需要用到的技术常见的网络营销方式
  • 上海黄浦 网站制作360手机助手
  • wordpress的网站无法发布文章百度会员登录入口
  • 做网站答辩总结范文网络营销常用的工具
  • 西昌做网站免费引流推广的方法
  • 网站怎么建设商城百度用户服务中心人工电话
  • 邢台提供网站建设公司报价网站软件下载
  • 做网站推广的话术万能bt搜索引擎
  • 二手车网站建设意见网络广告策划案例
  • 手机网站建设沈阳网页首页设计图片