如题,自定义一个filter,在doFilter方法中,chain.doFilter(request,response);之后为什么不能设置response的contentType,不光是这个,我发现在chain.doFilter(request,response);之后,所有尝试response的set方法都不管用。但是这些代码明明是执行了的,因为其他如输出语句都有输出到控制台,求释疑
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain fchain) throws IOException, ServletException {
System.out.println("do filter");

response.setContentType("text/html;charset=UTF-8");

fchain.doFilter(request, response);

System.out.println("after do filter"); response.setContentType("application/json;charset=UTF-8");

System.out.println(response.getContentType());
}
下面是打印结果,其中分割是servlet的doGet中打印的
do filter
text/html;charset=UTF-8
---------------------------
after do filter
text/html;charset=UTF-8

解决方案 »

  1.   

    ServletRequest 
    ServletResponse 
    应该要引入httpServletRequest和httpServletResponse 
      

  2.   

    客户端浏览器发出的请求被封装成为一个HttpServletRequest对象, HttpServletRespons提供了与Http协议有关的方法。正如2L说的  肯定要将你的request,response转换成HttpServletRequest接口类型的
      

  3.   

    情况是这个样子的,chain最里面调用了servlet/jsp/action..... anyway,他们对response进行了写操作,并且,这个写操作的结果已经(至少部分)已经输出到了客户端的浏览器。也就是说servlet/jsp/action对response的写操作已经超过了response的buffer。这个时候,你再想去操作response的Header(不够是不是Content-Type)都无效了。因为根据HTTP协议,输出的Header在前(已经到了客户端,没法再改)
      

  4.   

    <%@ page buffer="1kb"%>
    <% response.setContentType("text/html;charset=UTF-8"); %>
    HELLO WORLD!
    <% response.setContentType("text/plain;charset=UTF-8"); %>
    <% for (int i = 0; i < 1000; i++) {%>
    HELLO WORLD!
    <% } %><% response.setContentType("application/json;charset=UTF-8"); %>
    <% for (int i = 0; i < 1000; i++) {%>
    HELLO WORLD!
    <% } %>tomcat6下面运行,最终获得的结果是text/plain;charset=UTF-8,
    修改buffer为100kb,获得的content-type=application/json;charset=UTF-8当然,这个只是纯实验,依据每个服务器实现可能略有不同。因为Servlet/JSP标准,貌似对此没有做明确界定(这部分我还要找找资料)。因此,大家最好避免这种情况。换言之,尽量一开始就算好Header,而不要在已经开始往response.getWriter或者getOutputStream开始写东西之后在setHeader