springboot增加过滤器后中文乱码

记录一下小问题

public class RepeatableHttpServletWrapper extends HttpServletRequestWrapper {
    private  byte[] body;

    public RepeatableHttpServletWrapper(HttpServletRequest request) throws IOException  {
        super(request);
        request.setCharacterEncoding("UTF-8");
        BufferedReader reader = request.getReader();
        try (StringWriter writer = new StringWriter()) {
            int read;
            char[] buf = new char[1024];
            while ((read = reader.read(buf)) != -1) {
                writer.write(buf, 0, read);
            }
            this.body = writer.getBuffer().toString().getBytes(StandardCharsets.UTF_8);
        }
    }

    public String getBody(){
        return new String(body, StandardCharsets.UTF_8);
    }

    @Override
    public ServletInputStream getInputStream() {
        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body);
        return new ServletInputStream() {
            @Override
            public boolean isFinished() {
                return false;
            }
            @Override
            public boolean isReady() {
                return false;
            }

            @Override
            public void setReadListener(ReadListener readListener) {
            }

            @Override
            public int read() {
                return byteArrayInputStream.read();
            }
        };
    }
    @Override
    public BufferedReader getReader() {
        return new BufferedReader(new InputStreamReader(this.getInputStream(), StandardCharsets.UTF_8));
    }
}
public class RepeatableWrapperFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        if (servletRequest.getCharacterEncoding() == null) {
            servletRequest.setCharacterEncoding("UTF-8");
        }
        ServletRequest requestWrapper = null;
        if(servletRequest instanceof HttpServletRequest) {
            requestWrapper = new RepeatableHttpServletWrapper((HttpServletRequest) servletRequest);
        }
        if(requestWrapper == null) {
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            filterChain.doFilter(requestWrapper, servletResponse);
        }
    }

    @Override
    public void destroy() {

    }
}

    @Bean
    public FilterRegistrationBean repeatableWrapperFilter() {
        FilterRegistrationBean<RepeatableWrapperFilter> registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new RepeatableWrapperFilter());
        registrationBean.addUrlPatterns("/*");
        registrationBean.setOrder(1);
        registrationBean.setAsyncSupported(true);
        return registrationBean;
    }
public class DataAuthenticationInterceptor implements HandlerInterceptor {


    private DataAuthenticationService dataAuthenticationService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         RepeatableHttpServletWrapper repeatableRequest = new RepeatableHttpServletWrapper(request);
         String body = repeatableRequest.getBody();
    }
              

之前做的一个功能需要 通过拦截器前置处理post请求中body的信息,由于body在request中是以流存在的,读完就没有了,所以需要增加一个过滤器来进行前置处理,在处理时候本地是正常的发布linux后出现中文乱码情况

方法1:在启动jvm的参数中增加 -Dfile.encoding=UTF-8

java -jar -Dfile.encoding=UTF-8 jar包

方法2:在xml文件的build标签中增加 jvm参数处理

<plugin>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-maven-plugin</artifactId>
	<version>${spring-boot.version}</version>
	<configuration>
		<fork>true</fork>
		<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
	</configuration>
</plugin>

方法3:处理读写是统一按照 UTF-8 处理
在这里插入图片描述
方法4: 增加 CharacterEncodingFilter 过滤器 ,这个过滤器优先级要高于新增的过滤器

@Bean
public FilterRegistrationBean characterEncodingFilter() {
    CharacterEncodingFilter filter = new CharacterEncodingFilter();
    filter.setEncoding("UTF-8");
    filter.setForceEncoding(true);
    FilterRegistrationBean<CharacterEncodingFilter> registrationBean = new FilterRegistrationBean();
    registrationBean.setFilter(filter);
    registrationBean.addUrlPatterns("/*");
    registrationBean.setOrder(0);
    return registrationBean;
}

相关推荐

  1. SpringBoot】打包成Docker镜像日志输出中文

    2024-07-12 19:14:02       27 阅读
  2. Oracle imp导入数据中文

    2024-07-12 19:14:02       36 阅读
  3. CentOS 中文

    2024-07-12 19:14:02       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 19:14:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 19:14:02       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 19:14:02       58 阅读
  4. Python语言-面向对象

    2024-07-12 19:14:02       69 阅读

热门阅读

  1. MySQL慢查询日志(Slow Query Log)

    2024-07-12 19:14:02       17 阅读
  2. ZCC5429 异步升压芯片

    2024-07-12 19:14:02       21 阅读
  3. 介绍一下docker的打包命令

    2024-07-12 19:14:02       22 阅读
  4. 华为OJ平台

    2024-07-12 19:14:02       19 阅读
  5. inline与nullptr

    2024-07-12 19:14:02       22 阅读
  6. ActiViz中的跟随者vtkFollower

    2024-07-12 19:14:02       22 阅读
  7. 常见的load_file()读取的敏感信息

    2024-07-12 19:14:02       21 阅读
  8. tomcat的介绍与优化

    2024-07-12 19:14:02       21 阅读
  9. Elasticsearch实战指南:从下载到高级应用全解析

    2024-07-12 19:14:02       21 阅读
  10. python .join用法

    2024-07-12 19:14:02       18 阅读
  11. 力扣995.K连续位的最小翻转次数

    2024-07-12 19:14:02       22 阅读
  12. ubuntu cp 命令 拷贝文件

    2024-07-12 19:14:02       20 阅读
  13. 探索 Scikit-Learn:机器学习的强大工具库

    2024-07-12 19:14:02       19 阅读
  14. C# —— try catch

    2024-07-12 19:14:02       15 阅读
  15. 机器学习 - one-hot编码技术

    2024-07-12 19:14:02       21 阅读