问题描述
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("/*")
进行了注释。
我删除了此文件,现在一切正常。