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无效,在这里进行页面跳转,返回到登录页面
}