Web应用遇到问题记录

mokingone 2012-09-03

JBoss应用遇到问题记录

Q1. 2012-9-3 应用部署到weblogic下(Tomcat下无问题),filter执行时报错: 

java.lang.IllegalStateException: Cannot resize buffer - 299 bytes have already been written (Servlet 2.3, sec. 5.1)
at weblogic.servlet.internal.ServletResponseImpl.setBufferSize(ServletResponseImpl.java:346)
at weblogic.servlet.jsp.PageContextImpl.initialize(PageContextImpl.java:74)
at weblogic.servlet.jsp.PageContextImpl.<init>(PageContextImpl.java:110)
at weblogic.servlet.jsp.JspFactoryImpl.getPageContext(JspFactoryImpl.java:40)
at jsp_servlet.__index._jspService(__index.java:65)

原因: 调用了response.sendRedirect()之后,再调用了filterChain.doFilter(request, response)

解决 修改代码,确保 sendRedirect 之后 return 或 doFilter 之前无 sendRedirect。

see: http://blog.csdn.net/xlhybjava/article/details/1038357

Q2. 2012-10-19 Jetty下,post 1个表单数据时报错: 

java.lang.IllegalStateException: Form too large210799>200000

原因: Jetty对form post data的大小有限制,默认为200000bytes

解决 修改Jetty的默认限制值。

see: Web容器对form post data大小的默认限制的修改方法

Q3. 2012-9 关于通过 request.getParameter(...) 获取数据的注意事项:
对于POST方式提交的数据,在首次调用 request.getParameter(...) 方法时,
会触发web容器解析数据流并将解析后的parameters置入parameterMap。
方法request.getInputStream()中会改变Using stream flag值(Jetty中这个变量名为inputState, Tomcat中为usingInputStream),
而request.getParameter(...)中会根据Using stream flag值来决定是否去解析流数据,
所以若在调用request.getParameter(...)前先调用了request.getInputStream(),
会引发BUG: POST方式提交的FORM数据无法通过request.getParameter方式得到值。
一般,处理非multipart/byteranges类型FORM提交的数据时,只需要通过容器去取即可,无需额外处理。

Q4. 2013-5 某APP分别部署在同一个机子weblogic的2个不同域上(即webapp的url仅ip不同),在同个客户端用同一个账号先后登录这2个APP,后登录的会把前面登录的“踢掉”,而如果登录的是同个APP,反而不会出现“踢掉”。

原因: http是无状态的协议,因此web容器若要在服务端保存状态,通常的做法是往客户端浏览器cookie中写当前会话的sessionid,其默认的cookie名字是JSESSIONID。
但是cookie的domain信息是基于IP地址的不包含端口,这会导致相同IP地址不同端口的web应用cookie被共享。
因此在登录1个APP后,服务器就往用户的浏览器里写入了一个名为JSESSIONID的cookie,该APP服务端通过该id能找到相应的session,
此时用户又登录了另1个APP,因为2个APP使用了相同的IP(或主机名称),浏览器会把JSESSIONID的这个cookie发给另1个APP的服务端,
但这个服务端是找不到该id对应的session的,因此会重新生成一个sessionid并写到浏览器cookie中,这个新的sessionid会覆盖之前由前1个APP生成的sessionid。
此时当再访问前1个APP时,因为cookie中的sessionid被改变,服务端也同样找不着之前的session信息了,这导致当前登录的信息丢失。

另外这个问题似乎是和web容器有关,据网上一些文章,weblogic下存在这个问题,而tomcat下则不存在这个问题。

更多weblogic session问题:http://liuzidong.iteye.com/blog/1132219

解决 /WEB-INF/weblogic.xml 文件中增加如下配置:

<session-descriptor>
   <cookie-name>XXX-JSESSIONID</cookie-name>
</session-descriptor>


Problem:  Tomcat 如何设置JVM参数

Solution

Windows: 在 catalina.bat 的最前面加上 set JAVA_OPTS=-Dxx1=yy -Dxx2=yy2

Linux: 在 catalina.sh 的最前面加上 JAVA_OPTS=-Dxx1=yy -Dxx2=yy2

相关推荐