Spring Boot 跨域(cross),消息转换器(HttpMessageConverter),返回乱码问题(controller,拦截器)

官方推荐,通过实现 org.springframework.web.servlet.config.annotation.WebMvcConfigurer接口,进行相应配置。

  • org.springframework.web.servlet.config.annotation.WebMvcConfigurer#addCorsMappings 跨域配置
  • org.springframework.web.servlet.config.annotation.WebMvcConfigurer#configureMessageConverters 消息转换器配置

DefinedWebMvcConfigurer.java

package site.yuyanjia.template.common.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.nio.charset.StandardCharsets;
import java.util.List;

/**
 * DefinedWebMvcConfigurer
 *
 * @author seer
 * @date 2018/6/15 10:10
 */
@Configuration
@ConfigurationProperties(prefix = DefinedWebMvcConfigurer.PREFIX)
public class DefinedWebMvcConfigurer implements WebMvcConfigurer {
    public static final String PREFIX = "yuyanjia.webmvc";

    /**
     * 跨域允许地址
     */
    private String[] corssOrigins = {"*"};

    /**
     * 跨域匹配地址
     */
    private String corssMapping = "/**";

    /**
     * 全局跨域设置
     *
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping(corssMapping)
                .allowedOrigins(corssOrigins)
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
                .allowCredentials(true)
                .maxAge(3600);
    }

    /**
     * 消息转换器
     * <p>
     * {@link StringHttpMessageConverter} 默认编码是 ISO_8859_1 ,这里添加一个 UTF-8 编码的,解决 Controller 返回结果乱码问题
     *
     * @param converters
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8));
    }

    public String[] getCorssOrigins() {
        return corssOrigins;
    }

    public void setCorssOrigins(String[] corssOrigins) {
        this.corssOrigins = corssOrigins;
    }

    public String getCorssMapping() {
        return corssMapping;
    }

    public void setCorssMapping(String corssMapping) {
        this.corssMapping = corssMapping;
    }
}

application.yml

yuyanjia:
  webmvc:
    corss-mapping: /website/**

以上配置能解决Controller返回字符串乱麻问题

拦截器返回乱码可以通过 配置文件进行 配置

application.yml

spring:
  http:
    encoding:
      force: true
      enabled: true
      charset: UTF-8
server:
  tomcat:
    uri-encoding: UTF-8

上述的跨域配置也是能解决Controller层的问题,拦截器被跨域的话,就不可以了。可以参考 Spring Boot 跨域过滤器(过滤器跨域问题)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容