有没有办法在没有请求的情况下将响应发送到已打开的会话?

时间:2019-06-12 18:40:27

标签: java tomcat httpresponse

我想通过已经形成的旧会话(仍然存在)将数据(我称之为响应)发送到先前的Http请求者(假设有新的请求到达同一servlet)。

原因是发生的事件(不是有问题的同一会话中的另一个请求)希望servlet通过我们的旧会话向我们的旧请求者(假设另一个请求者来了)说些什么(字符串)。 有办法(提示)吗?

((编辑 我知道HTTP通信并不常见。而且我担心,如果在“ service”方法结束后关闭(OSI第5层的)套接字,那么我的问题就不会解决,可能我不得不通过进入API来停止套接字的关闭服务器容器(在我的情况下为“ Tomcat”)。 通过查看this可能就是这种情况。 ))

无论如何,这是我尝试做的事情:

1)我试图保存所讨论会话的HttpServletResponse对象(在“服务”方法中),但是随后出现了(来自另一个请求者的)较新的请求(因此在同一请求中保存了“服务”方法) servlet,将其命名为“ servlet1”,将再次执行),这对我来说很奇怪,很明显,我保存的HttpServletResponse被覆盖了。

2)当我尝试保存从HttpServletResponse.getWriter()获得的PrintWriter对象(在下面显示的代码中)时,我发现了相同的结果(令我惊讶的是)。再一次,当另一个请求到来时,它被覆盖了。

3)我对HttpSession抱有希望,但我怀疑我是否可以编写它。 (检查其方法here

同样,我只想编写一个字符串并将其放在(我的)客户端。如果有某种控制权,我可以在会话中进行发送字符串,以及在客户端上获取字符串的方法,那将是很好的。

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 9.0.01上安装的Tomcat。

1 个答案:

答案 0 :(得分:0)

看来我需要修改服务器容器本身,因此我将从here下载源代码,并按照this guideline来构建Tomcat。必须以不关闭插座的方式进行修改。我可能会在servlet中添加一个方法来手动关闭套接字。