Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当Jsp页面关闭时,如何终止称之为Jsp的线程?_Java_Multithreading_Jsp - Fatal编程技术网

Java 当Jsp页面关闭时,如何终止称之为Jsp的线程?

Java 当Jsp页面关闭时,如何终止称之为Jsp的线程?,java,multithreading,jsp,Java,Multithreading,Jsp,我在JSP页面中调用一个线程,该线程继续运行。我希望在关闭JSP页面时终止此线程。哇,那有可能吗 我的代码将其放在主体标记JSP中: <% Thread Ping=new PingThread(); Ping.Start(); %> 提前感谢您的意思是当用户关闭窗口时将其关闭?没有为此触发事件,因此您无法执行此操作。您可以通过JavaScript在用户关闭窗口时进行Ajax调用来实现这一点,但它可能无论如何都不起作用 我想到的疑问是:为什么要在JSP页面中启动thead这样可怕

我在JSP页面中调用一个线程,该线程继续运行。我希望在关闭JSP页面时终止此线程。哇,那有可能吗

我的代码将其放在主体标记JSP中:

<%
Thread Ping=new PingThread();
Ping.Start();
%>


提前感谢

您的意思是当用户关闭窗口时将其关闭?没有为此触发事件,因此您无法执行此操作。您可以通过JavaScript在用户关闭窗口时进行Ajax调用来实现这一点,但它可能无论如何都不起作用


我想到的疑问是:为什么要在JSP页面中启动thead这样可怕的事情?通过滥发F5按钮,有人可以获得历史上最简单的DOS攻击!重新考虑您的应用程序以避免这种解决方案(根据请求盲目启动线程,而不仅仅是从JSP启动线程)。

您可以在卸载前使用Javascript
卸载事件来确定窗口正在关闭,尽管您使用哪一个以及如何使用取决于您想要做什么。

如果您从JSP启动线程,则无法保证当用户退出页面时线程将停止

  • 当用户关闭或离开普通HTML页面时,不会从客户端向服务器发送通知。一点也没有

  • 您可以在web页面中包含一些javascript,以便在用户关闭窗口或移动到其他页面时对服务器执行AJAX调用。然而,在某些情况下,不会打电话;e、 g

    • 用户的机器死机

    • 用户的浏览器崩溃

    • 用户已关闭javascript

    • 用户在代码中设置断点

    • 等等

    即使打了电话,也不能保证不会因为暂时的网络问题而丢失

最终的结果是,您的服务器有一个孤立线程,它将继续执行它正在执行的任何操作(在本例中,使用ICMP数据包攻击其他机器),直到您杀死web容器为止


这是一个非常非常糟糕的主意。

您可以将上述内容包含在另一个循环中,该循环由jsp页面通过ajax调用不时设置为true。如果jsp页面未将该值设置为true,则可以安全地假定浏览器已关闭。但是,您需要一个线程标识符,比如用户的会话id或ip。

作为(某种),您可以将javascript嵌入到网页中,以便在浏览器检测到当前浏览器窗口正在关闭时执行。请参阅本页,以了解有关及其处理的更多详细信息

注:

  • 无论页面是否是JSP,这些东西都可以工作。(例如……如果页面是纯HTML,那么它就可以工作……前提是服务器端有处理通知的内容。)

  • 此事件处理在用户web浏览器中执行

  • 服务器端不会被告知窗口关闭,除非事件处理程序向服务器发送一个(AJAX)请求来通知它

  • 正如我在回答前一个问题时所说,用户可以在客户端禁用事件处理

  • 正如我在回答前一个问题时所说的,不能保证AJAX请求会返回到服务器

  • 所有这些加起来就意味着,任何服务器端对窗口关闭事件的处理都是不可靠的。这是没有解决办法的。理论上没有,实践上也没有


在JSP中使用新线程不是个好主意,JSP是表示层。这是个糟糕的主意。你为什么不直接告诉我们你真正想做的是什么?“…然后你可以安全地假设浏览器已经关闭。”-这不是一个安全的假设。例如,可能只是网络中断,或者用户可能已经休眠了他/她的机器。然而,OP可以认为这些场景等同于窗口关闭。另一个问题是,这种方法无法及时检测事件。