注销时javajsf重定向

qlvxas9a  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(378)

我有一个视图范围的jsf页面。存在一个ace:dialog where 用户正在中工作。如果用户在两个小时内没有点击,他的会话就会被tomcat自动销毁。
如果用户在这两个小时后发送请求,我将重定向到登录页面(因为用户已注销)。问题是我变成了一个错误:

java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed

如果用户注销,是否有方法将每个请求重定向到登录页?如果会话被破坏了,我的备份bean会怎么样?
如果用户是请求子网站且未登录,则这是我的重定向方式:

@PostConstruct
public void initialize() {

    logger.debug("Start - " + new Throwable().getStackTrace()[0]);

    if (hasReadAccess()) {
        FacesContext.getCurrentInstance().getExternalContext().redirect(pPath);
        return;
    }

    logger.debug("End- " + new Throwable().getStackTrace()[0]);
}

如果用户发送ajax请求(例如使用roweditlistener),我的代码就是这样的:

public void rowEditListener(RowEditEvent ev) {

logger.debug("Start - " + new Throwable().getStackTrace()[0]);

if (hasReadAccess()) {
    FacesContext.getCurrentInstance().getExternalContext().redirect(pPath);
    return;
}

// do something

logger.debug("End - " + new Throwable().getStackTrace()[0]);
}

谢谢!

nqwrtyyt

nqwrtyyt1#

you can use spring:
public void logout() {
        try {
            SecurityContextHolder.getContext().setAuthentication(null);
            FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
            FacesContext.getCurrentInstance().getExternalContext()
                    .redirect(FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath() + "/j_spring_security_logout?faces-redirect=true");

        } catch (Exception e) {

        }
    }

相关问题