如果我在 Util 方法中传递我的 HttpServletRequest、HttpServletResponse、HttpSession 对象,它是线程安全的吗?
Posted
技术标签:
【中文标题】如果我在 Util 方法中传递我的 HttpServletRequest、HttpServletResponse、HttpSession 对象,它是线程安全的吗?【英文标题】:Is it thread safety, if I pass my HttpServletRequest, HttpServletResponse, HttpSession objects in Util methods? 【发布时间】:2013-09-12 15:26:05 【问题描述】:假设我有一个重复的任务将处理 HttpSession 或 HttpServletRequest 或 HttpServletResponse 对象。这个处理可能是从 HttpSession 中抽象出一些数据,或者在 HttpServletRequest/HttpServletResponse 中设置/获取一些属性。
这里我举一个例子。我想要我当前从会话中登录的 UserId。为此,我在其中一个 Util 类中创建了一个 Util 方法。
public static Integer getCurrentLoggedInUserId(HttpSession session)
// here I will process session object and get first User object and
//after that I will get id from that User Object. This is one repeated task in my app.
下载文件的第二个示例。
public static void downloadFile(HttpSrvletResponse response)
// here I will set some attribues/parameters in response for download file.
现在我的问题是这样做的线程安全吗?我的意思是建议将会话/请求/响应对象从控制器/servlet 传递给 Util 类?如果没有,这种重复任务的解决方案是什么?
提前致谢。
【问题讨论】:
而是正确使用框架,然后以框架允许的方式分发您想要的任何内容。我不确定struts2-interceptors 是否是您需要的,但框架会帮助您 你不修改传递的对象,线程安全有什么问题? 是@user2310289 我没有在我的第一个示例中修改任何对象.. 但是请参阅更新问题中的第二个示例.. 如果出现这种情况怎么办? 没有什么特别的,只要同步对象,它们就会被定义为单例(静态)。 感谢 user2310289..但是我应该同步哪些对象?如果可能的话,你能举个例子吗? 【参考方案1】:是的。如果Util
类没有状态,这将是线程安全的。
通常不会这样做,因为理想情况下只有 Servlet 应该知道请求/响应对象。
如果您正在编写一个专门作用于请求/响应对象的实用程序类,请考虑编写一个包装器类来包装请求对象,然后对其进行操作。
这样,您在为每个请求创建新包装器时就不会担心线程安全问题。
【讨论】:
嗨..蜘蛛鲍里斯..我不明白“Util 类没有状态”是什么意思。你能在这里解释一下或给出一些示例链接吗? 以及如何根据请求/响应创建包装类?【参考方案2】:线程安全涉及线程之间共享的数据。例如,在您的情况下,如果您获得了当前用户并希望将其存储在一组 todaysUsers 中,那么您必须保护对该组的数据访问:
private static Set<Integer> todaysUsers = new HashSet<Integer>();
public static Integer getCurrentLoggedInUserId(HttpSession session)
Integer currentUser = ......
synchronized(todaysUsers)
todaysUsers.add(currentUser);
return currentUser;
因为每个线程都会使用自己的会话调用该方法,这不是数据共享,因此不存在线程安全问题
【讨论】:
嗨.. GerritCap 非常感谢.. 我明白你所说的.. 仅用于检索数据,没有问题.. 我更新问题中的第二个示例怎么样?以上是关于如果我在 Util 方法中传递我的 HttpServletRequest、HttpServletResponse、HttpSession 对象,它是线程安全的吗?的主要内容,如果未能解决你的问题,请参考以下文章