关于servlet的response的Content-Length大小的详细分析

问题:

情景1:

response.setContentLength(3);
        response.getWriter().write("acb");
        request.getRequestDispatcher("/ss1").forward(request, response);

情景2:

response.setContentLength(1);
        response.getWriter().write("acb");
        request.getRequestDispatcher("/ss1").forward(request, response);

情景3:  

response.setContentLength(100);
        response.getWriter().write("acb");
        request.getRequestDispatcher("/ss1").forward(request, response);

情景4:

response.getWriter().write("acb");
        request.getRequestDispatcher("/ss1").forward(request, response);

描述:

情景1:正常显示,不能转发

关于servlet的response的Content-Length大小的详细分析_第1张图片

 

情景2:显示字母a,不能转发

关于servlet的response的Content-Length大小的详细分析_第2张图片

情景3:如果数小的话直接不能连接,如果数大的话会请求一段时间然后不能连接

关于servlet的response的Content-Length大小的详细分析_第3张图片

情景4:不设置大小,显示成功,转发成功。

关于servlet的response的Content-Length大小的详细分析_第4张图片

原因:

1.一般情况下客户端会在接受完Content-Length长度的数据之后才会开始解析。而在Tomcat上,页面处理过程中会将需要out.print的数据都放在缓存中,然后一次性的返回给客户端。

2.java.lang.IllegalStateException: Cannot forward after response has been committed

  1. 不可以又向respose里输东西,然后又要要求跳转。
  2. 同一次请求处理执行多次跳转。

3.经过实际测试,contentlength太大会等待,太小会截断。

 

总结:

   经过以上三点,展开分析,

1.这里的response中的contentlength就是write的内容,

2.如果在代码中规定了contentlength,那么执行的时候经过了这个contentlength,到了指定的地方就会告诉浏览器开始解析吧,这个时候紧接着因为是将数据放在response缓冲区里面的,这时候又要往response缓冲区里面输入东西,又要跳转就会报错java.lang.IllegalStateException: Cannot forward after response has been committed,所以跳转不成功。所以情景123跳转不成功。

3.如果代码中并没有规定contentlength,那么在执行的时候也不知道到底到了contentlegth没有,也不会要求往response里面输入东西,而是等转发完了之后才知道结束了,才会产生contentlength,所以情景4能够正常的转发。

4.因为上面的第三点,所以会出现情景123中的等待或者截断。

结语:

以上全为个人推理,希望不要误导赶路人。

感谢:

https://www.jianshu.com/p/d606732f2ebc

https://www.cnblogs.com/daxin/p/3759102.html

https://blog.csdn.net/cuiyaoqiang/article/details/51141424

https://blog.csdn.net/u013894607/article/details/53327560

 

你可能感兴趣的:(#,JAVA,------,SSH,SSM,Servlet,Work,problems❤️)