Java异常处理和HttpSession
作为异常处理的一部分,我希望打印HTTP会话中的数据,如下所示: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); } 我的问题是,由于将有多个线程更新会话,我是否获得了发生异常的正确用
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。感谢您的详细解释。