[英]Is there a way to send a response to an opened session without a request?
我想通過已經形成的舊會話(仍處於活動狀態)將數據(我稱之為響應)發送給先前的Http請求者(假設一個較新的請求來到同一個servlet)。
原因是發生的事件(在同一個會話中不是另一個請求)希望servlet通過我們的舊會話向我們的舊請求者說一些(字符串)(假設另一個請求者來了)。 是否有辦法(暗示)這樣做?
((編輯:我知道這對於HTTP通信來說並不常見。而且我擔心如果套接字(OSI的第5層)在“服務”方法結束后關閉,那么我的問題並不是首先存在並且可能我將不得不通過進入服務器容器的API(在我的情況下為“Tomcat”)來停止套接字。通過查看這個可能就是這種情況。))
無論如何,這是我試圖做的:
1)我試圖保存相關會話的HttpServletResponse對象(在“服務”方法中),但是當一個較新的請求(來自另一個請求者)來了(並且因此在同一個servlet中的“service”方法,名稱)它“servlet1”,將再次被執行),對我來說,奇怪的是,對我而言,顯然我保存的HttpServletResponse被誇大了。
2)當我嘗試保存PrintWriter對象(在下面顯示的代碼中)時,我從HttpServletResponse.getWriter()得到了相同的結果(我更驚訝)。 另外,當另一個請求到來時,它被誇大了。
3)我對HttpSession抱有希望,但我懷疑自己是否能夠通過它寫作。 ( 在這里查看其方法)
再一次,我只想寫一個字符串並在(我的)客戶端獲取它。 如果有一種控制我可以在會話上發送一個字符串,以及一種在客戶端上獲取它的方法,這將是好的。
class Session {
protected PrintWriter printWriter;
protected int index;
Session(PrintWriter pW, int index) {
this.printWriter = pW;
this.index = index;
}
}
@WebServlet("/servlet1")
public class Servlet1 extends HttpServlet {
private static int session_index = 0;
protected static volatile ArrayList<Session> list = new ArrayList<Session>();
protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
session_index++;
System.out.println( "Servlet1 : " + session_index );
response.getWriter().append("Served at: ").append(request.getContextPath());
list.add(new Session(response.getWriter(), session_index));
if( list.get(0).printWriter.equals( response.getWriter() ) ) {
System.out.println( "Servlet1 : same old PrintWriter object" );
}
}
我期望這條消息“Servlet1:相同的舊PrintWriter對象”不會出現在我的控制台中,但它在所有后續請求中都出現了。
它是在Linux上安裝的Tomcat 9.0.21,我正在服務器端(localhost)上工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.