我正在尝试确保来自基于Jersey的Java应用程序的所有JSON响应均在其ContentType标头中附加了UTF-8字符编码参数。
所以,如果它是一个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 html" target="_blank">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()
{
}
}
我见过其他类似的问题,但似乎没有一个问题。我尝试将我的过滤器注册为第一个也是最后一个没有运气的过滤器。
多亏了此页面上的其他答案,我找到了一种实现方法。。。非常接近他们的建议,但是事实证明,使它起作用的唯一方法是重写“
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
}
}
我正在使用ASP构建我的第一个WebAPI。NETMVC4WebAPI。 请求必须使用应用程序/json ContentType以utf-8为字符集发送。 我的POST方法如下所示: 无论何时发送POST请求,参数“value”都为null。请求正文包含Json:。 我更喜欢将Post方法的参数设置为包含Json的字符串或JObject类型(来自Json.NET库)。我如何做到这一点?这可能吗?
我正在Django中开发一个讨论应用程序,它有线程,帖子,回复和投票。投票使用通用外键和内容类型来确保用户只能在特定的线程/帖子/回复上投票一次。 投票模型看起来像这样: 投票序列化程序: 处理投票的观点: 请求。数据内容: 当我投票时,Django Rest Framework序列化程序抛出一个错误: 149是线程模型的ContentType的正确id,根据 我几乎不知道是什么导致了这一切。。。
问题内容: 由于内容类型冲突,我无法将Django固件加载到我的MySQL数据库中。首先,我尝试仅从我的应用程序中转储数据,如下所示: 但由于我的应用程序“ escola”使用了其他应用程序中的表,所以我一直没有遇到外键问题。我一直在添加其他应用程序,直到我明白了: 现在的问题是,当我尝试将数据加载为测试装置时,违反了以下约束条件: 问题答案: 将使用更持久的外键表示形式。在Django中,它们被
问题内容: 我有一个ajax调用,它将表单数据发送到php函数。因为我读到很多东西,所以使用最佳实践是我想尝试的。但不幸的是,我的脚本在使用时不返回任何内容。如果删除它,脚本将执行应做的事情。 您知道原因可能是什么以及为什么吗?谢谢! 和我的PHP: 问题答案: 使用时,您将无法依靠被填充。 仅针对表单编码的内容类型填充。 因此,您需要像这样从PHP原始输入读取数据: 当然,如果要发送,则实际上应
问题内容: 我注意到在jquery中使用$ .post()时,默认contentType为application / x-www-form-urlencoded- 当我的ASP.NET MVC代码需要具有contentType = application / json时 如何使$ .post()发送contentType = application / json?我已经有大量的$ .post()函
问题内容: 仅在真正更改数据的情况下,才有可能使用“更新后”触发器。我知道“新旧”。但是使用它们时,我只能比较列。例如“ NEW.count <> OLD.count”。 但我想要类似的东西:如果“ NEW <> OLD”,则运行触发器 一个例子: 关键是,有一个更新,但是 什么都没有改变 。但是无论如何,触发器都在运行。恕我直言,应该有一个没有的方法。 我知道我可以使用 如果现在b <> OLD