【问题标题】:Spring Boot Webflux - Set UTF-8 EncodingSpring Boot Webflux - 设置 UTF-8 编码
【发布时间】:2018-07-29 14:14:44
【问题描述】:

我一直在使用Spring Boot 2.0.0.RC1 并使用spring-boot-starter-webflux 来构建一个返回文本数据流的REST 控制器。

@GetMapping(value = "/")
public Flux<String> getData(){
    return Flux.interval(Duration.ofSeconds(2))
        .map(l -> "Some text with umlauts (e.g. ä, ö, ü)...");
}

由于文本数据包含一些变音符号(例如ä、ö、ü),我想将响应的 Content-Type 标头从 text/event-stream 更改为 text/event-stream;charset=UTF-8。因此,我尝试将flux包装成ResponseEntity。像这样:

@GetMapping(value = "/")
public ResponseEntity<Flux<String>> getData(){
    return ResponseEntity
            .ok()
            .contentType(MediaType.parseMediaType("text/event-stream;charset=UTF-8"))
            .body(Flux.interval(Duration.ofSeconds(2))
                    .map(l -> "Some text with umlauts (e.g. ä, ö, ü)..."));
}

现在,向端点发出 curl 请求表明 Content-Type 保持不变:

< HTTP/1.1 200 OK
< transfer-encoding: chunked
< Content-Type: text/event-stream
<
data:Some text with umlauts (e.g. ├ñ, ├Â, ├╝)...

我怀疑MediaType.parseMediaType() 方法是问题所在,但媒体类型已正确解析(如此屏幕截图所示):

但是,参数charset 似乎被忽略了。 如何将编码更改为 UTF-8,以便浏览器正确解释元音变音字符?

编辑:GetMapping 注释中设置produces 字段也不起作用。

@GetMapping(value = "/", produces = "text/event-stream;charset=UTF-8")
public ResponseEntity<Flux<String>> getData(){
    return ResponseEntity
            .accepted()
            .contentType(MediaType.parseMediaType("text/event-stream;charset=UTF-8"))
            .body(Flux.interval(Duration.ofSeconds(2))
                    .map(l -> "Some text with umlauts (e.g. ä, ö, ü)..."));
}

【问题讨论】:

  • 试试这个@GetMapping(value = "/", produces = "text/event-stream;charset=UTF-8")
  • 感谢您的评论。我以前试过,但也没有用。
  • Chrome 的行为相同。我认为主要问题是响应的Conent-Type 标头中缺少charset=UTF-8 部分。既然没有了,我猜想是 ANSI 编码。
  • 问题不在于你的代码,而在于 curl。您需要设置 Accept header 。试试这个curl -v -H "Accept:text/event-stream;charset=UTF-8" --verbose http://localhost:8080/
  • 即使设置了 Accept 标头,结果也是一样的:&gt; GET / HTTP/1.1 &gt; Host: localhost:8080 &gt; User-Agent: curl/7.58.0 &gt; Accept:text/event-stream;charset=UTF-8 &gt; &lt; HTTP/1.1 202 Accepted &lt; transfer-encoding: chunked &lt; Content-Type: text/event-stream &lt; data:Some text with umlauts (e.g. ├ñ, ├Â, ├╝)...

标签: spring spring-boot project-reactor spring-webflux reactive-streams


【解决方案1】:

您可以在返回浏览器之前创建过滤器并处理响应

    import java.io.IOException;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    import org.springframework.core.annotation.Order;
    import org.springframework.stereotype.Component;
    import org.springframework.core.Ordered;
    
    // esse filtro foi criado pra converter para UTF-8 o response do Flux<ServerSentEvent<String>>
// this filter was created to convert all responses to UTF8, including Flux<ServerSentEvent<String>>
    @Component
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public class FluxPreProcessorFilter implements Filter {
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            response.setCharacterEncoding("UTF-8");
            chain.doFilter(request, response);
        }
    
    }

【讨论】:

    猜你喜欢
    • 2017-01-02
    • 2014-08-31
    • 2016-09-23
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2012-05-26
    • 2019-08-01
    相关资源
    最近更新 更多