簡體   English   中英

有沒有辦法在沒有請求的情況下向已打開的會話發送響應?

[英]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)上工作。

看起來我需要修改服務器容器本身,所以我將從這里下載源代碼,並遵循本指南來構建Tomcat。 必須以不關閉插座的方式進行修改。 我可以在servlet中添加一個方法來手動關閉套接字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM