【发布时间】:2014-05-29 20:02:16
【问题描述】:
我正在尝试确保来自基于 Jersey 的 java 应用程序的所有 JSON 响应都有一个 UTF-8 字符编码参数附加到它们的 ContentType 标头。
因此,如果它是 JSON 响应,我希望 Content-Type 的响应标头为
内容类型:application/json;charset=UTF-8
EDIT: I know I can do this on a case by case basis, but I'd like to do it globally, so it affects all content responses that have a content type of "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,但他们似乎都没有这个问题。我尝试将我的过滤器注册为第一个也是最后一个过滤器,但没有成功。
【问题讨论】:
标签: java filter content-type jersey-2.0