我们的grails应用程序中的java.lang.IllegalStateException: getAttribute: Session already invalidated
错误数量很少。
我们尝试检查过滤器中的会话是否无效,如果是,则重定向到同一页面但不起作用。看起来会话在请求中间失效。
处理此错误的正确方法是什么?我们应该在顶层放置一个错误处理程序并返回一些http状态吗?
我们在Grails 3.3.9应用程序中的请求中间也得到了随机的java.lang.IllegalStateException: getAttribute: Session already invalidated
异常。
我们可以将错误找到这两个原因:
1)过期的会话。我们通过将application.yml
中的会话超时增加到一个工作日来修复它。
server:
session:
timeout: 28800 # 8h in seconds ...
2)由浏览器“链接预加载”引起的“用户注销”。现代浏览器将在用户尝试访问它们之前预加载页面中的链接。这会在用户稍后单击链接时提高加载速度。这意味着如果您的“注销链接”是一个接受GET请求的简单链接,即使您不想,浏览器也可能会将您注销。
我们发现我们有一个链接来进行注销。所以我们将它从GET更改为POST。我们的退出链接如下:
<g:link controller="logout">
<g:message code="title.logout" default="logout" />
</g:link>
所以我们改成了
<a href="#" onclick="document['hiddenLogoutForm'].submit();">
<g:message code="title.logout" default="logout" />
</a>
<form style="display: none"
name="hiddenLogoutForm"
method="POST"
action="${createLink(controller:'logout') }" >
</form>
这两个变化使java.lang.IllegalStateException: getAttribute: Session already invalidated
消失了。祝好运!