gpt4 book ai didi

java - 仅在内容类型 === JSON 时更改 Java 过滤器中的内容类型或字符编码

转载 作者:搜寻专家 更新时间:2023-10-31 08:17:00 26 4
gpt4 key购买 nike

我试图确保来自基于 Jersey 的 Java 应用程序的所有 JSON 响应都在其 ContentType header 中附加了 UTF-8 字符编码参数。

所以如果它是一个 JSON 响应,我希望 Content-Type 的响应 header 是

Content-Type: application/json;charset=UTF-8

编辑:我知道我可以根据具体情况执行此操作,但我想在全局范围内执行此操作,因此它会影响内容类型为“application/json”的所有内容响应。

如果我只是尝试在我的过滤器中设置字符编码而不考虑内容类型,它工作正常。但如果 ContentType 是“application/json”,我只想设置字符编码。我发现 response.getContentType() 方法总是返回 null,除非我先调用 chain.doFilter。但是,如果我在此之后尝试更改字符编码,它似乎总是被覆盖。

import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.ws.rs.core.MediaType;

public class EnsureJsonResponseIsUtf8Filter implements Filter
{
private class SimpleWrapper extends HttpServletResponseWrapper
{
public SimpleWrapper(HttpServletResponse response)
{
super(response);
}

@Override
public String getCharacterEncoding()
{
return "UTF-8";
}
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
chain.doFilter(request, response);

if (response.getContentType() != null && response.getContentType().contains(MediaType.APPLICATION_JSON))
{
response.setCharacterEncoding("UTF-8");
chain.doFilter(request, new SimpleWrapper((HttpServletResponse) response));
}
}

@Override
public void init(FilterConfig filterConfig) throws ServletException
{
}

@Override
public void destroy()
{
}
}

我看过其他similar questions ,但他们似乎都没有这个问题。我已经尝试将我的过滤器注册为第一个和最后一个过滤器,但没有成功。

最佳答案

感谢此页面上的其他答案,我找到了一种方法......非常接近他们的建议,但事实证明我能让它工作的唯一方法是覆盖“getOutputStream”并查看此时的 contentType。我已将此过滤器作为链中的第一个过滤器,它似乎工作正常。

import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.ws.rs.core.MediaType;

public class EnsureJsonIsUtf8ResponseFilter implements Filter
{
final String APPLICATION_JSON_WITH_UTF8_CHARSET = MediaType.APPLICATION_JSON + ";charset=" + java.nio.charset.StandardCharsets.UTF_8;

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
HttpServletResponse r = (HttpServletResponse) response;
HttpServletResponse wrappedResponse = new HttpServletResponseWrapper(r)
{
@Override
public ServletOutputStream getOutputStream() throws java.io.IOException
{
ServletResponse response = this.getResponse();

String ct = (response != null) ? response.getContentType() : null;
if (ct != null && ct.toLowerCase().startsWith(MediaType.APPLICATION_JSON))
{
response.setContentType(APPLICATION_JSON_WITH_UTF8_CHARSET);
}

return super.getOutputStream();
}
};

chain.doFilter(request, wrappedResponse);
}

@Override
public void init(FilterConfig filterConfig) throws ServletException
{
// This method intentionally left blank
}

@Override
public void destroy()
{
// This method intentionally left blank
}
}

关于java - 仅在内容类型 === JSON 时更改 Java 过滤器中的内容类型或字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23084182/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com