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