我有一个JSF2应用程序。我有一个会话作用域的登录bean和一个视图作用域的注销bean。当我登录时,我使用重定向,它工作正常。但是注销失败并带有重定向。如果我在没有重定向的情况下注销它就可以工作。
@ManagedBean
@ViewScoped
public class MbLogout extends BaseJsf {
private static final long serialVersionUID = 2992671241358926373L;
public String logout() throws DfException {
getFacesContext().getExternalContext().invalidateSession();
//return "login?faces-redirect=true"; // fails with this
return "login";
}
}
登录页面绑定了登录bean,所以我怀疑这可能与它有关,虽然我不明白为什么它不起作用。错误是:
java.lang.IllegalStateException: Cannot create a session after the response has been committed
我的猜测是,我尝试在登录页面上创建一个会话,因为我访问会话bean虽然我没有看到任何错误,但它没有重定向。
我正在使用MyFaces 2.1。
答案 0 :(得分:3)
我建议使用Servlet而不是bean来注销,托管bean(特别是视图作用域)不适合注销。例如:
@WebServlet(name = "LogoutServlet", urlPatterns = {"/logout"}) // Can be configured in web.xml aswell
public class LogoutServlet extends HttpServlet {
private static final String redirectURL = "http://www.somepage.com";
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Destroys the session for this user.
if (request.getSession(false) != null) {
request.getSession(false).invalidate();
}
response.sendRedirect(redirectURL );
}
}
答案 1 :(得分:0)
它似乎与视图范围中的bean有关,它本身应该在会话中序列化。请改为使用作用域。无论如何,视图范围对于注销没有多大意义。
@ManagedBean
@RequestScoped
public class MbLogout extends BaseJsf {
// ...
}