关于 Cannot forward after response has been committed的错误

摘要:
这个错误顾名思义:就是在给客户端做出提交响应完毕后,就不能再次使用request的转发。

这个错误顾名思义:就是在给客户端做出提交响应完毕后,就不能再次使用request的转发。

代码原先是这样的:

1 packagecom.bdqn.jsp.study.web.filter;
2 
3 import javax.servlet.*;
4 importjavax.servlet.annotation.WebFilter;
5 importjavax.servlet.http.HttpServletRequest;
6 importjavax.servlet.http.HttpServletResponse;
7 importjava.io.IOException;
8 
9 @WebFilter(filterName = "checkLoginFilter", urlPatterns = "/*")
10 public class CheckLoginFilter implementsFilter {
11 @Override
12     public void init(FilterConfig filterConfig) throwsServletException {
13 
14 }
15 
16 @Override
17     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throwsIOException, ServletException {
18         HttpServletRequest request =(HttpServletRequest) servletRequest;
19         HttpServletResponse response =(HttpServletResponse) servletResponse;
20         if (request.getRequestURI().contains("/user")) {
21             Object value = request.getSession().getAttribute("user");
22             if (value == null) {
23                 response.sendRedirect(request.getContextPath() + "/login.jsp");
24                 //return;
25 }
26 }
27 filterChain.doFilter(request, response);
28 }
29 
30 @Override
31     public voiddestroy() {
32 
33 }
34 }

注意这里是个filter主要作用:用于判断用户是否登录后才能访问相关页面,地址栏里有“/user”的地址信息,就认为改地址是登录后才能进行访问

然而在某一个servlet里有如下相关代码:

  if (returnValue != null) {
      request.getRequestDispatcher("/" +returnValue.toString()).forward(request, response);
  }

如果这么写就出问题了,因为在filter里response做出重定向后,还要执行doFilter方法,因此当执行servlet中的转发操作时就会报错了,因为在response.sendRedirect()会认为已经给response的commited属性设置成true了,因此不能再进行转发

免责声明:文章转载自《关于 Cannot forward after response has been committed的错误》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android学习笔记十:异步处理Django入门学习(一)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

HttpClient(四)-- 使用代理IP 和 超时设置

1.代理IP的用处:   在爬取网页的时候,有的目标站点有反爬虫机制,对于频繁访问站点以及规则性访问站点的行为,会采集屏蔽IP措施。这时候,就可以使用代理IP,屏蔽一个就换一个IP。 2.代理IP分类:   代理IP的话 也分几种: 透明代理、匿名代理、混淆代理、高匿代理,一般使用高匿代理。 3.使用 RequestConfig.custom().setP...

Python接口自动化测试(5):Postman使用-用例执行

一个完整的测试,是必须要有断言的,没有断言就相当于没有预期结果是不完整的,Postman给我们提供了方便的断言方式 可以通过JS脚本来编写Pre-request Script和Tests Script Pre-request Script :预置脚本,可以用来修改一些默认参数,在请求发送之前,有点类型unittest里面的setUp()方法。 Tests...

Django入门实践(二)

Django入门实践(二) Django模板简单实例     上篇中将html写在了views中,这种混合方式(指Template和views混在一起)不适合大型开发,而且代码不易管理和维护,下面就用Django自带的模板来学习(显示一个通讯簿)。    在views.py中添加函数addressbook   from django...

Chrome开发者工具详解(2)

Chrome开发者工具面板 面板上包含了Elements面板、Console面板、Sources面板、Network面板、Timeline面板、Profiles面板、Application面板、Security面板、Audits面板这些功能面板。这些按钮的功能点如下: Elements:查找网页源代码HTML中的任一元素,手动修改任一元素的属性和样式且...

InstallShield 静默安装

可能先需要获取安装包参数,安装包参数获取/?或是/HELP InstallScrip工程 1. 在命令行窗口中使用 -R 参数(即record) 运行安装程序。 例如:Setup.exe -RorSetup.exe -r -f1"c:setup.iss" //-f1:指定iss文件输出路径 2. 正常安装,在安装结束后不能选择“立刻重启动计算机”的选...

drf—— drf的请求与响应

一、Request#常用属性 -data :前端以post请求提交的数据都在它中 -FILES :前端提交的文件 -query_params:就是原来的request.GET -重写了 __getattr__ -使用新的request.method其实取得就是原生request.method(通过反射实现)...