IllegalStateException

  • 异常
java.lang.IllegalStateException: getOutputStream() has already been called for this response

 

  • 解决

这是web容器生成的servlet代码中有out.write(””),这个和JSP中调用的response.getOutputStream()产生冲突.
即Servlet规范说明,不能既调用 response.getOutputStream(),又调用response.getWriter(),无论先调用哪一个,在调用第二个时候应会抛出 IllegalStateException,因为在jsp中,out变量是通过response.getWriter得到的,在程序中既用了response.getOutputStream,又用了out变量,故出现以上错误。

 

1.在程序中添加:
out.clear();
out = pageContext.pushBody();
就可以了;

2,不要在%〕〔%之间写内容包括空格和换行符
3,在页面写入图片的时候,需要flush()
 OutputStream output=response.getOutputStream();
 output.flush();
4,在页面确定写入<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312”>

5,在response.sendRedirect()方法后加return语句即可,如下:
  response.sendRedirect("login.jsp");
  return;

6,删除java文件和jsp文件,重新创建。(目前以此解决问题了。)

 

  • 异常
java.lang.IllegalStateException: getWriter() has already been called for this response
  • 解决

在执行下述代码时报错,

OutputStream out = getResponse().getOutputStream();

原因为代码中有打开的Response.getWriter(),未关闭,因调用点较多,不好一一排查。

通过查看代码,看到response中的usingWriter=true,随即想办法将该标志位设置为false。

response.reset(); 即可,注意reset后缓存消失,设置消失。 

OutputStream和Writer在一个response中不能同时获得。

 

  • 异常
java.lang.IllegalStateException: setAttribute: Session already invalidated
  • 解决

参考:http://blog.csdn.net/wang12/article/details/6780805

经调查发现,问题出在HttpSession session.getAttribute("paramName");这个方法执行时。

异常原因为:从Session中获取属性值的时候,Session已经无效。

有两种可能导致Session无效(1)Session timeout;(2)程序中调用了session.invalidate()方法。

搜索了整个项目Code,发现在用户注销的过程中的确执行了session.invalidate()方法。

解决方法:

HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();

    //传递参数true,那么当session过期时,新的session被创建,接下来可通过session.isNew()的返回值来判断是不是同一个session

   //返回值为:true,新的session被创建,action提交执行时的那个用户session已经无效

   //返回值为:false,同一个session,仍然有效
    HttpSession session = request.getSession(true);
    if (session.isNew()) {

       //session无效,在这里进行页面跳转,返回到登录页面

    }

posted @ 2017-07-28 13:52  小闲石  阅读(1277)  评论(0编辑  收藏  举报