我正在使用带有JSF2框架的Glassfish 4服务器。
我的问题
调用response.sendRedirect方法时,我遇到IllegalStateException。
我没有一个线索为什么会引发此异常。
上下文
对于每个xhtml页面,我都会调用此方法来检查用户是否仍然登录。
<body id="body" onload="#{utilisateurBean.isUserLoggedIn()}">
方法
public void isUserLoggedIn() throws IOException {
if(this.user == null){
HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
response.sendRedirect("Project/accueil/index.xhtml");
}
}
异常
Infos: Exception when handling error trying to reset the response.
java.lang.IllegalStateException
或者
Avertissement: Servlet.service() for servlet session.AppExceptionHandler threw exception
java.lang.IllegalStateException: Cannot forward after response has been committed
我不知道为什么要提交回复。
感谢您的帮助:)
答案 0 :(得分:1)
当响应已提交/定义时,您无法更改响应。
您在此处显示该页面,因此您的回复已经定义。
您必须以另一种方式执行此操作,例如显示错误消息,指出用户未连接并要求用户重新登录。
你也可以使用javascript进行重定向。
答案 1 :(得分:1)
使用以下代码段更改您的代码:
public void isUserLoggedIn() throws IOException {
if(this.user == null){
HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
response.sendRedirect("Project/accueil/index.xhtml");
return;
}
}
或添加一项检查以验证是否已提交响应。
response.isCommitted()
有关已提交的回复的更多信息,请查看this。