Java异常处理和HttpSession

Java异常处理和HttpSession,java,servlets,Java,Servlets,作为异常处理的一部分,我希望打印HTTP会话中的数据,如下所示: try{ //business logic } catch(Exception ex){ String user = session.get("userId"); //get user from HTTP Session. log.info("Exception when processign the user "+user); } 我的问题是,由于将有多个线程更新会话,我是否获得了发生异常的正确用

作为异常处理的一部分,我希望打印HTTP会话中的数据,如下所示:

try{  
    //business logic
} catch(Exception ex){
    String user = session.get("userId"); //get user from HTTP Session.
    log.info("Exception when processign the user "+user); 
}

我的问题是,由于将有多个线程更新会话,我是否获得了发生异常的正确用户ID?

客户端之间不共享
HttpSession
。所以那部分已经安全了。剩余部分取决于您自己的代码来获取和处理
HttpSession
实例。例如,如果您将
HttpSession
作为应用程序范围类的实例变量,比如servlet本身,那么它确实不是线程安全的,因为在您访问它时,它可能会被另一个请求覆盖

public class SomeServlet extends HttpServlet {

    private HttpSession session;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        session = request.getSession();

        // ...

        Object object = session.getAttribute("foo"); // Not threadsafe!
    }  
另见:

会话对于每个用户都是唯一的(如果代码符合标准)


这里是sun关于如何进行会话的教程

谢谢您的回答。事实上,我正在使用JSF作为特定的工具,并尝试获取会话映射中的数据,如facesContext.getExternalContext().getSessionMap(“用户ID”)。因此,在catch块中,我得到了whci异常的userId,我相信这是根据您的回答发生的。原则是正确的。只要不将
FacesContext
ExternalContext
SessionMap
指定为托管bean的实例变量,那么它是安全的。“请参阅”链接绝对值得一读,对于JSF也是如此,因为它在封面下使用了ServletAPI。感谢您的详细解释。