简单http服务器中的会话处理

Ton*_*ony 1 java session

我根据下一个模型编写了一个小的Http Web服务器:

public class HttpServer {

    public static void main(String[] args) throws Throwable {
        ServerSocket ss = new ServerSocket(8080);
        while (true) {
            Socket s = ss.accept();
            System.err.println("Client accepted");
            new Thread(new SocketProcessor(s)).start();
        }
    }

    private static class SocketProcessor implements Runnable {

        private Socket s;
        private InputStream is;
        private OutputStream os;

        private SocketProcessor(Socket s) throws Throwable {
            this.s = s;
            this.is = s.getInputStream();
            this.os = s.getOutputStream();
        }

        public void run() {
            try {
                readInputHeaders();
                writeResponse("<html><body><h1>Hello</h1></body></html>");
            } catch (Throwable t) {
                t.printStackTrace();
            } finally {
                try {
                    s.close();
                } catch (Throwable t) {
                   t.printStackTrace();
                }
            }
            System.err.println("Client processing finished");
        }

        private void writeResponse(String s) throws Throwable {
            String response = "HTTP/1.1 200 OK\r\n" +
                    "Server: YarServer/2009-09-09\r\n" +
                    "Content-Type: text/html\r\n" +
                    "Content-Length: " + s.length() + "\r\n" +
                    "Connection: close\r\n\r\n";
            String result = response + s;
            os.write(result.getBytes());
            os.flush();
        }

        private void readInputHeaders() throws Throwable {
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            while(true) {
                String s = br.readLine();
                if(s == null || s.trim().length() == 0) {
                    break;
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 在端口上运行服务器套接字 x
  2. accept进去while
  3. 如果出现新请求,请在新线程中处理请求
  4. 等待另一个请求

但是我如何实现会话?是否存在将一个会话与另一个会话区分开的机制?关闭浏览器后如何清理会话?如何保持连接打开?

Eri*_* B. 6

我不确定你保持连接选项是什么意思,但是在我的脑海中,我会创建一个独特的(随机)cookie值并将其发送回客户端.这是您的会话ID.在服务器上,您将此会话ID存储在某种类型的映射中(ConcurrentHashMap可能是线程安全的一个很好的选择)作为键,并且任何特定的会话数据都将是值对象的一部分.

当您收到传入连接时,请检查它是否提供具有已知会话ID的cookie.如果是这样,那么您可以从Session HashMap中检索值对象并将其应用于当前连接.

如果会话ID不存在,则表示它是新会话.

通过适当地设置cookie到期时间(即:MaxAge的负值),只要浏览器会话关闭,cookie就会被删除.