我想通过已经形成的旧会话(仍然存在)将数据(我称之为响应)发送到先前的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。
答案 0 :(得分:0)
看来我需要修改服务器容器本身,因此我将从here下载源代码,并按照this guideline来构建Tomcat。必须以不关闭插座的方式进行修改。我可能会在servlet中添加一个方法来手动关闭套接字。