如果我在 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 对象,它是线程安全的吗?的主要内容,如果未能解决你的问题,请参考以下文章

传递方法作为参数[重复]

160527项目上线后session(远程session)

值传递和引用传递

为啥我的 exec 命令失败但如果命令在终端中传递则可以工作?

PaymentServlet代码

CallbackServlet代码