标签:
1 public void doFilter(ServletRequest request, ServletResponse response, 2 FilterChain chain) throws IOException, ServletException { 3 // TODO Auto-generated method stub 4 HttpServletRequest req=(HttpServletRequest)request; 5 HttpServletResponse res=(HttpServletResponse)response; 6 HttpSession session=req.getSession(); 7 String url = req.getRequestURI().toString(); 8 chain.doFilter(req, res); 9 String str = "docheck"; 10 if(!url.endsWith("login")){ 11 if(! url.contains(str)){ 12 if(session.getAttribute("managerId") == null){ 13 PrintWriter out = res.getWriter(); 14 // ServletOutputStream out = res.getOutputStream(); 15 String loginPage = "/ManagerAction/login"; 16 StringBuilder builder = new StringBuilder(); 17 builder.append("<script type=\"text/javascript\">"); 18 builder.append("window.location.href=‘"); 19 builder.append(loginPage); 20 builder.append("‘;"); 21 builder.append("</script>"); 22 out.print(builder.toString()); 23 out.close(); 24 } 25 } 26 } 27 }
被这个问题折磨的挺难受,虽然不影响程序的正常使用,但是还是要解决的,查阅了相关资料,这是web容器生成的servlet代码中有out.write(””),这个和调用的response.getOutputStream()产生冲突.即Servlet规范说明,不能既调用 response.getOutputStream(),又调用response.getWriter(),无论先调用哪一个,在调用第二个时候应会抛出 IllegalStateException。
之后将printWriter改为outputStream后,仍然不成功,会报错显示java.lang.IllegalStateException: WRITER
偶然间我将outputStream改为了ServletOutputStream竟然不报错了。
printWriter与 ServletOutputStream的区别
1. PrintWriter是以字符为单位,对所有的信息进行处理,而ServletOutputStream仅对二进制的资料进行处理。
2. PrintWriter在输出字符文本时内部需要
将字符串转换成某种字符集编码的字节数组,使用他的好处就是不需要自己来完成从字符串到字节数组的转换。
转换的字符集编码是通过设置setContentTpye或setCharacterEncoding或setLocale等方法实现的;使用
ServletOutputStream对象直接从一个字节输入流中读取出来,然后再原封不动的输出到客服端。
3. 这两个方法相互排斥,只能调用其一,如果要用,则要在换方法之前调用flush(),将缓冲区数据冲掉。
4. PrintWriter自动清空缓冲区的功能被使能时(构造函数中autoFlush置为true),仅当println()方法被调用时才自动清缓冲区,而不是像PrintStream一样遇到一个换行符就清缓冲。
至于outputStream与ServletOutputStream输出方式不同,一个是write(byte【】) 另一个是print(stringBuilder) 还有什么区别再详细研究。
使用printWrite 在jetty中报错 java.lang.IllegalStateException: STREAM
标签:
原文地址:http://www.cnblogs.com/zzy-blogs/p/4569107.html