首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹簧引导网络流量-集UTF-8编码

弹簧引导网络流量-集UTF-8编码
EN

Stack Overflow用户
提问于 2018-02-19 10:54:44
回答 1查看 3.6K关注 0票数 3

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

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

由于文本数据包含一些umlauts (例如,text/event-stream,ü),所以我想将响应的内容类型标题从text/event-stream;charset=UTF-8改为Content头。因此,我尝试将其封装到ResponseEntity中。如下所示:

代码语言:javascript
复制
@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请求显示内容类型保持不变:

代码语言:javascript
复制
< 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,以便浏览器正确解释umlaut字符?

编辑:在GetMapping注释中的设置-- produces字段也不工作。

代码语言:javascript
复制
@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. ä, ö, ü)..."));
}
EN

回答 1

Stack Overflow用户

发布于 2021-07-16 09:01:40

您可以在此返回浏览器之前创建筛选器和进程响应。

代码语言:javascript
复制
    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);
        }
    
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48864564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档