Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Servlet处理完成后使用ServletFilter更新响应内容类型_Java_Servlets - Fatal编程技术网

Java 如何在Servlet处理完成后使用ServletFilter更新响应内容类型

Java 如何在Servlet处理完成后使用ServletFilter更新响应内容类型,java,servlets,Java,Servlets,我尝试使用ServletFilter更改ServletResponse内容类型。但是,Servlet(在我的内容AxisServlet中)在chain.doFilter()调用时更新该内容类型。但其他响应头已正确更新 我尝试在调用doFilter后设置响应头。当时没有更新响应头 有人知道在Servelt完成后更新ServletResponse的内容类型的方法吗 代码: public class HeaderFilter implements Filter { private HashM

我尝试使用ServletFilter更改ServletResponse内容类型。但是,Servlet(在我的内容AxisServlet中)在chain.doFilter()调用时更新该内容类型。但其他响应头已正确更新

我尝试在调用doFilter后设置响应头。当时没有更新响应头

有人知道在Servelt完成后更新ServletResponse的内容类型的方法吗

代码:

public class HeaderFilter implements Filter {

    private HashMap<String,String> rsCustomHeaders = new HashMap<String,String>();

    public void init(FilterConfig config) throws ServletException {

        Enumeration<String> initParameterNames = config.getInitParameterNames();

        while (initParameterNames.hasMoreElements()) {

            String initParameterName = initParameterNames.nextElement();

            rsCustomHeaders.put(initParameterName, config.getInitParameter(initParameterName));

        }

        System.out.println("init().rsCustomHeaders : " + rsCustomHeaders);
    }

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

        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;

        for (Map.Entry<String, String> rsCustomHeaderEntry : rsCustomHeaders.entrySet()) {
            httpServletResponse.addHeader(rsCustomHeaderEntry.getKey(), rsCustomHeaderEntry.getValue());
        }

        System.out.println("doFilter().encoding :Set Response Headers Done");

        chain.doFilter(httpServletRequest, httpServletResponse);

        System.out.println("doFilter().HeaderFilter is Done!!!");


    }

    public void destroy() {
        System.out.println("destroy(). : Destroy is called!");
    }
}
公共类HeaderFilter实现过滤器{
private HashMap rsCustomHeaders=new HashMap();
public void init(FilterConfig config)抛出ServletException{
枚举initParameterNames=config.getInitParameterNames();
while(initParameterNames.hasMoreElements()){
字符串initParameterName=initParameterNames.nextElement();
rsCustomHeaders.put(initParameterName,config.getInitParameter(initParameterName));
}
System.out.println(“init().rsCustomHeaders:+rsCustomHeaders”);
}
public void doFilter(ServletRequest请求、ServletResponse响应、FilterChain链)
抛出IOException、ServletException{
HttpServletRequest HttpServletRequest=(HttpServletRequest)请求;
HttpServletResponse HttpServletResponse=(HttpServletResponse)响应;
对于(Map.Entry rsCustomHeaderEntry:rsCustomHeaders.entrySet()){
httpServletResponse.addHeader(rsCustomHeaderEntry.getKey(),rsCustomHeaderEntry.getValue());
}
System.out.println(“doFilter().encoding:设置响应头完成”);
doFilter(httpServletRequest,httpServletResponse);
System.out.println(“doFilter().HeaderFilter已完成!!!”;
}
公共空间销毁(){
System.out.println(“destroy():调用destroy!”);
}
}
web.xml

  <filter>
    <filter-name>HeaderFilter</filter-name>
    <filter-class>filters.HeaderFilter</filter-class>
      <init-param>
        <param-name>content-type</param-name>
        <param-value>application/xml; charset=utf-8</param-value>
      </init-param>
      <init-param>
        <param-name>Content_type</param-name>
        <param-value>text/xml; charset=utf-8</param-value>
      </init-param>
      <init-param>
        <param-name>rq_content-type</param-name>
        <param-value>text/xml; charset=utf-8</param-value>
      </init-param>
      <init-param>
        <param-name>Header-X</param-name>
        <param-value>Value-X</param-value>
      </init-param>
  </filter>

  <filter-mapping>
    <filter-name>HeaderFilter</filter-name>
    <url-pattern>/services/GradeThreeMath</url-pattern>
  </filter-mapping>

头部过滤器
过滤头过滤器
内容类型
应用程序/xml;字符集=utf-8
内容类型
text/xml;字符集=utf-8
rq_内容类型
text/xml;字符集=utf-8
标题-X
Value-X
头部过滤器
/服务/三年级数学

在原始
响应上设置内容类型
。 与重写的
setContentType
一起使用,以包装传递给
child.doFilter
响应。Overrided
setContentType
应忽略任何更改内容类型的尝试

代码片段:

// Setting content type
httpServletResponse.setContentType("you-content-type");
chain.doFilter(httpServletRequest, new HttpServletResponseWrapper(httpServletResponse) {
    @Override
    public void setContentType(final String type) {
        // Ignore any further attempts to change content type
    }
});

rsCustomHeaders是否在init()之后加载了值?此外,在启动和处理过程中,服务器日志中是否存在任何异常?是否正确加载了值,并且没有异常。除内容类型(例如:Header-X,content_-type)之外的Resonse头已经成功更新。为AxisServlet代码添加代码?我希望tp将其作为最后一个选项。无论如何谢谢你!非常感谢你。让我试试!kgeorgiy,一件小事。在我的例子中,我希望在内容类型中发送一个空格(例如:text/xml;charset=utf-8)。现在,内容类型在没有空格的情况下更新。你对此有什么想法吗?从技术上讲,空格是可选的,不会影响内容类型的含义。所以,servlet容器可以自由地将其剥离出来,遵守规范的任何客户机都不会受到影响。但是,如果您试图解决有缺陷的客户端,您可以尝试使用
response.setHeader
来提供所需的确切
内容类型。Ok kgeorgiy。我明白你的意思。但我要处理的是一个有缺陷的客户,需要这样做。实际上,除了设置内容类型之外,我已经在做了。不管怎样,我会进一步尝试。又多了!我得到了kgeorgy,当我像下面一样发送它时,它工作了。text/xml 字符集=utf-8