为了账号安全,请及时绑定邮箱和手机立即绑定

添加<h:form>会导致java.lang.IllegalStateException:

添加<h:form>会导致java.lang.IllegalStateException:

慕慕森 2019-07-09 14:23:32
添加<h:form>会导致java.lang.IllegalStateException:无法在提交响应后创建会话在添加以下非常简单的JSF 2页面后,我将面临以下异常<h:form>:java.lang.IllegalStateException: Cannot create a session after the response has been committed     at org.apache.catalina.connector.Request.doGetSession(Request.java:2758)     at org.apache.catalina.connector.Request.getSession(Request.java:2268)我在Tomcat 7.0.22和JDK 7上使用mojarra 2.1.3和PrimeFaces3.0M4。该页是一个非常基本的数据表:<html xmlns="http://www.w3.org/1999/xhtml"     xmlns:h="http://java.sun.com/jsf/html"     xmlns:f="http://java.sun.com/jsf/core"     xmlns:p="http://primefaces.org/ui"><h:head></h:head><h:body>     <h:form>                 <p:dataTable var="car" value="#{tableBean.cars}">                  ......        </p:dataTable>     </h:form></h:body></html>页面在浏览器上显示正确,但在控制台上我看到异常。如果我删除<h:form>.这是如何造成的,我如何解决呢?
查看完整描述

3 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

这是一个已知的问题,你们的报告确实是这样的。第2215期..当响应缓冲区溢出(由于大量内容)并且响应在创建会话之前提交时,就会发生这种情况。这是由于mojarra试图尽可能推迟“不必要”会话的创建(这本身就是一件好事)。

在他们修好之前,有几个解决办法:

  1. 创建一个Filter这确实HttpServletRequest#getSession()以前FilterChain#doFilter()..优点:无需更改JSF配置/代码。缺点:当您希望避免不必要的会话创建时,您自己也是如此。

  2. 打电话ExternalContext#getSession()带着true在bean的(POST)构造函数或preRenderView听众。优势:事实上,没什么。缺点:太无趣了。

  3. 添加名称为com.sun.faces.writeStateAtFormEnd和价值falseweb.xml..优点:相对于#1和#2,将真正避免不必要的会话创建。</h:form>到达了。如果您的表单不是非常大,那么影响应该是最小的。但是,如果您的<h:form>在视野中起步相对较晚。这可能与#4相结合。

  4. 添加名称为javax.faces.FACELETS_BUFFER_SIZE以及Facelets响应缓冲区大小的值,以字节为单位(例如,65535),以便整个HTML输出或至少<h:form>(参见#3)适合响应缓冲区。有利/不利,见第3条。

  5. 添加名称为javax.faces.STATE_SAVING_METHOD和价值clientweb.xml..优点:除非您有会话作用域bean,否则不会创建会话。它也立即解决了潜在的问题。ViewExpiredException案子。缺点:增加了网络带宽的使用。如果您使用的是部分状态保存,那么影响应该是最小的。

为什么当你移除的时候这个问题就消失了?<h:form>,这是因为不需要创建任何会话来存储视图状态。


更新*这是根据复本第2277期自Mojarra 2.1.8以来就固定了。所以,你也可以升级到至少那个版本。


查看完整回答
反对 回复 2019-07-09
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

随着昨天发布的javax.Faces新版本2.1.21,这个问题似乎已经消失了。宣布新版本:

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.faces</artifactId>
    <version>2.1.21</version></dependency>

并替换Glassfish模块文件夹中的javax.faces.jar,将javax.faces.jar替换为新版本2.1.21。


查看完整回答
反对 回复 2019-07-09
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

在我的例子中(myFaces-2.2.8&Tomcat 8.0.23),问题是在welcome-fileweb.xml..调试时,Tomcat按预期创建了404,但不知怎的,我的Faces随后尝试访问会话,这导致了java.lang.IllegalStateException: Cannot create a session after the response has been committed..中使用有效页。welcome-fileweb.xml帮我解决了这个问题。


查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 395 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信