首页 > 其他分享 >springboot处理乱码问题原理

springboot处理乱码问题原理

时间:2023-02-28 10:55:40浏览次数:64  
标签:filter force springboot encoding public 乱码 原理 Type properties

我们在用spring-springmvc时,需要配置一个过滤器 CharacterEncodingFilter

CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding("utf-8");
filter.setForceRequestEncoding(true); //是否对请求对象进行编码过来
filter.setForceResponseEncoding(true); //是否对响应对象做过滤

在springboot中,由于自动装配机制,不需要我们手动配置了,HttpEncodingAutoConfiguration

 

@Configuration
@EnableConfigurationProperties(HttpProperties.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {

    private final HttpProperties.Encoding properties;

    public HttpEncodingAutoConfiguration(HttpProperties properties) {
        this.properties = properties.getEncoding();
    }

    @Bean
    @ConditionalOnMissingBean
    public CharacterEncodingFilter characterEncodingFilter() {
        CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
        filter.setEncoding(this.properties.getCharset().name());
        filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
        filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
        return filter;
    }
}

由此可见,是否进行编码过滤,都是通过 HttpProperties.Encoding properties进行判断的:

@ConfigurationProperties(prefix = "spring.http")
public class HttpProperties {/**
     * HTTP encoding properties.
     */
    private final Encoding encoding = new Encoding();
/**
     * Configuration properties for http encoding.
     */
    public static class Encoding {

        public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;

        /**
         * Charset of HTTP requests and responses. Added to the "Content-Type" header if
         * not set explicitly.
         */
        private Charset charset = DEFAULT_CHARSET;

        /**
         * Whether to force the encoding to the configured charset on HTTP requests and
         * responses.
         */
        private Boolean force;  //如果这个属性为true就会对请求和响应都进行utft-8编码过滤

        /**
         * Whether to force the encoding to the configured charset on HTTP requests.
         * Defaults to true when "force" has not been specified.
         */
        private Boolean forceRequest; //是否对请求进行过滤

        /**
         * Whether to force the encoding to the configured charset on HTTP responses.
         */
        private Boolean forceResponse; //是否对响应进行过滤

       
    //这个是判断请求或者响应是否要过滤的代码
        public boolean shouldForce(Type type) {
       //根据类型来取配置的请求过滤还是响应过滤  Boolean force = (type != Type.REQUEST) ? this.forceResponse : this.forceRequest;
       //如果没配置,就判断 this.force的值,因为该值对请求和响应都生效 if (force == null) { force = this.force; }
       //如果还是没配置,那么默认,请求就会进行过滤  if (force == null) { force = (type == Type.REQUEST); } return force; } public enum Type { REQUEST, RESPONSE } } }

通过上面 shouldForce(Type type)方法可以知道,在没有相关配置时,默认只会对请求进行过滤,所以要想对响应也进行过滤,需要在yml中进行配置:

spring:
http:
encoding:
charset: UTF-8
force: true

 

 

 

 

 

 

 

 


标签:filter,force,springboot,encoding,public,乱码,原理,Type,properties
From: https://www.cnblogs.com/yangxiaohui227/p/17163210.html

相关文章

  • 深度理解Redux原理并实现一个redux
    Redux的作用是什么Redux的作用在于实现状态传递、状态管理。在这里你可能会说了,如果是状态传递,那我props的传递不也是可以达到这样的效果吗?context上下文方案不也是可以达......
  • springboot集成easyexcel(阿里)
    poi比较占用内存。easyexcel性能优化不少,值得一看。pom.xml中添加:<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.6</......
  • springboot中json参数映射
    文章目录​​json映射不到实体上​​​​问题分析​​​​解决方案​​​​json映射到String查不到数据​​​​问题分析​​​​解决方案​​​​自动映射入参可以多吗,可以......
  • 转载:pageOffice插件 springboot实现服务器上Word文档在线打开编辑保存
    pageOffice插件springboot实现服务器上Word文档在线打开编辑保存需求:在oa系统上,想实现在线,服务器上doc,docx文档,在web打开,编辑。编辑后,可以再同步保存到服务器端。......
  • SpringBoot项目结构
    一.总体概述SpringBoot框架简单来说就是一个Web框架,其目的在于快速开发一个Web应用的后端实现主要包括三部分:java文件夹,Resource文件夹,pom.xml二.Java文件夹Co......
  • springboot+mybatis-plus数据库mysql+sybase遇到的一些问题
    我们服务启动时,sybase数据库连接直接创建10个连接。(为什么启动时会创建这么多连接?)有时候可以写入sybase库,大部分写入失败查询sybase库数据可以查出来,没问题尝试的方......
  • SpringCloudAlibaba、SpringCloud、SpringBoot、Spring版本对应关系
    SpringCloudAlibaba版本说明:https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明最新(SpringBoot3.0以下)示例:SpringCloudAlibabaVersionSpringCloud......
  • 计算机组成原理--各个硬件
                      ......
  • JPEG编码协议--编码原理
      音视频领域里面,JPEG编码是最常用的图片编码格式。接下去几篇文章打算从JPEG图片编码开始到视频编解码,学习总结下音视频的编码原理、相关文件协议,现在让我们先进入jpe......
  • SpringBoot 搭建微服务初体验
    (SpringBoot搭建微服务初体验)前言大家好,微服务是现在面试中必不可少的一项技能了,掌握微服务,不仅能够加薪升职,还能在面试中,底气十足,不怯场,不怕被压薪资。所以今天就特意......