当前位置: 首页 > 面试题库 >

仅当ContentType === JSON时才更改Java过滤器中的ContentType或CharacterEncoding

糜征
2023-03-14
问题内容

我正在尝试确保来自基于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