HttpServletRequest获得新会话

问题描述

我有一个通过oauth进行身份验证的应用程序。

public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,servletexception {
    HttpServletRequest httpReq = (HttpServletRequest) request;
    HttpServletResponse httpResp = (HttpServletResponse) response;

    // Check if already logged in
    if (getUser(httpReq) != null) {
        chain.doFilter(request,response);
        return;
    }

    // Try to parse auth response
    if (procAuthResponse(httpReq)) {
        chain.doFilter(request,response);
        return;
    }

    // Go to auth server
    sendAuthRequest(httpReq,httpResp);
}

这很好。 在procAuthResponse方法中,我正在解析服务器的响应并对此进行响应。

HttpSession session = request.getSession();
session.setAttribute(USER_PRINCIPLE_ATR,userInfo);

它也可以很好地工作,但是有一个使用getCurrent user方法的会话范围的类,该类由servlet使用。

    public UserInfo getCurrentUser() {

        HttpSession session = getHttpSession();

        if (session == null) {
            LOG.warn("Method getCurrentUser: unable to find a session");
            return null;
        }

        Object user = session.getAttribute(OAuthLoginFilter.USER_PRINCIPLE_ATR);
        if (!(user instanceof UserInfo)) {
            LOG.warn(String.format("Method getCurrentUser,wrong type for attribute %s",OAuthLoginFilter.USER_PRINCIPLE_ATR));
            return null;
        }

        currentUser = (UserInfo) user;

        return currentUser;
    }

方法被多次调用,结果表明,在第一次调用时,所有操作均按预期进行,然后,getHttpSession()返回不包含在过滤器类中设置的任何信息的另一个会话。每次都不是新会话,没有所需信息的会话总是相同的。

getHttpSession()的代码

private HttpSession getHttpSession() {
    Object request = FacesContext.getCurrentInstance().getExternalContext().getRequest();
    if (!(request instanceof HttpServletRequest)) {
        LOG.warn("not a valid http request");
        return null;
    }
    HttpServletRequest hreq = (HttpServletRequest) request;
    return hreq.getSession(false);
}

你知道为什么会这样吗?

感谢您的帮助

解决方法

仍然有一个旧的过滤器类,未在web.xml中进行配置,但用@WebFilter("/*")进行了注释。
我删除了此文件,现在一切正常。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...