package HTTPV3;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
public class HttpRequest {
private String method;
private String url;
private String version;
private Map<String, String> headers = new HashMap<>();
private Map<String, String> parameters = new HashMap<>();
private Map<String, String> cookies = new HashMap<>();
private String body;
public static HttpRequest build(InputStream inputStream) throws IOException {
HttpRequest request = new HttpRequest();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String fistLine = bufferedReader.readLine();
String[] fistLineTokens = fistLine.split(" ");
request.method = fistLineTokens[0];
request.url = fistLineTokens[1];
request.version = fistLineTokens[2];
int pos = request.url.indexOf("?");
if (pos != -1) {
String str = request.url.substring(pos + 1);
parseKV(str, request.parameters);
}
String line = "";
while ((line = bufferedReader.readLine()) != null && line.length() != 0) {
String[] headersTokens = line.split(": ");
request.headers.put(headersTokens[0], headersTokens[1]);
}
String cookie = request.headers.get("Cookie");
if (cookie != null) {
parseCookie(cookie, request.cookies);
}
if ( "POST".equalsIgnoreCase(request.method) ||
"PUT".equalsIgnoreCase(request.method) ) {
int contentLength = Integer.parseInt(request.headers.get("Content-Length"));
char[] buffer = new char[contentLength];
int len = bufferedReader.read(buffer);
request.body = new String(buffer, 0, len);
parseKV(request.body, request.parameters);
}
return request;
}
private static void parseCookie(String cookie, Map<String, String> cookies) {
String[] cookieTokens = cookie.split("; ");
for (String kv : cookieTokens) {
String[] ret = kv.split("=");
cookies.put(ret[0], ret[1]);
}
}
private static void parseKV(String str, Map<String, String> parameters) {
String[] kvTokens = str.split("&");
for (String kv : kvTokens) {
String[] ret = kv.split("=");
parameters.put(ret[0], ret[1]);
}
}
public String getMethod() {
return method;
}
public String getUrl() {
return url;
}
public String getVersion() {
return version;
}
public String getBody() {
return body;
}
public String getHeader(String key) {
return headers.get(key);
}
public String getParameter(String key) {
return parameters.get(key);
}
public String getCookie(String key) {
return cookies.get(key);
}
}
package HTTPV3;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;
public class HttpResponse {
private String version = "HTTP/1.1";
private int status;
private String message;
private Map<String, String> headers = new HashMap<>();
private StringBuilder body = new StringBuilder();
private OutputStream outputStream = null;
public static HttpResponse build(OutputStream outputStream) {
HttpResponse response = new HttpResponse();
response.outputStream = outputStream;
return response;
}
public void setVersion(String version) {
this.version = version;
}
public void setStatus(int status) {
this.status = status;
}
public void setMessage(String message) {
this.message = message;
}
public void setHeader(String key, String value) {
this.headers.put(key, value);
}
public void setBody(String content) {
this.body.append(content);
}
public void flush() throws IOException {
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
bufferedWriter.write(version + " " + status + " " + message + "\n");
headers.put("Content-Length", body.toString().getBytes().length + " ");
for (Map.Entry<String, String> entry : headers.entrySet()) {
bufferedWriter.write(entry.getKey() + ": " + entry.getValue());
}
bufferedWriter.write("\n");
bufferedWriter.write(body.toString());
bufferedWriter.flush();
}
}
在这里插入代码package HTTPV3;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class HttpServerV3 {
static class User {
public String userName;
public int age;
public String school;
}
private ServerSocket serverSocket = null;
private Map<String, User> sessions = new HashMap<>();
public HttpServerV3(int port) throws IOException {
this.serverSocket = new ServerSocket(port);
}
public void start() throws IOException {
System.out.println("服务器启动");
ExecutorService executorService = Executors.newCachedThreadPool();
while (true) {
Socket clientSocket = serverSocket.accept();
executorService.execute(new Runnable() {
@Override
public void run() {
process(clientSocket);
}
});
}
}
private void process(Socket clientSocket) {
try {
HttpRequest request = HttpRequest.build(clientSocket.getInputStream());
HttpResponse response = HttpResponse.build(clientSocket.getOutputStream());
if ("GET".equalsIgnoreCase(request.getMethod())) {
doGET(request, response);
} else if ("POST".equalsIgnoreCase(request.getMethod())) {
doPOST(request, response);
} else {
response.setStatus(405);
response.setMessage("Method Not Allowed");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void doPOST(HttpRequest request, HttpResponse response) {
if (request.getUrl().startsWith("/login")) {
String userName = request.getParameter("username");
String password = request.getParameter("password");
if ("li".equals(userName) && "123".equals(password)) {
response.setStatus(200);
response.setMessage("OK");
response.setHeader("Content-Type", "text/html; charset=utf-8");
String sessionId = UUID.randomUUID().toString();
User user = new User();
user.userName = "li";
user.age = 20;
user.school = "陕科大";
sessions.put(sessionId, user);
response.setHeader("Set-Cookie", "sessionId=" + sessionId);
response.setBody("<html>");
response.setBody("<div>欢迎" + userName + "</div>");
response.setBody("</html>");
} else {
response.setStatus(403);
response.setMessage("Forbidden");
response.setHeader("Content-Type", "text/html; charset=utf-8");
response.setBody("<html>");
response.setBody("<div>登陆失败<div>");
response.setBody("</html>");
}
}
}
private void doGET(HttpRequest request, HttpResponse response) throws IOException {
String sessionId = request.getCookie("sessionId");
User user = sessions.get(sessionId);
if (sessionId == null || user == null) {
response.setStatus(200);
response.setMessage("OK");
response.setHeader("Content-Type", "text/html; charset=utf-8");
InputStream inputStream = HttpServerV3.class.getClassLoader().getResourceAsStream("index.html");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line = null;
while ((line = bufferedReader.readLine())!= null) {
response.setBody(line + "\n");
}
bufferedReader.close();
} else {
response.setStatus(200);
response.setMessage("OK");
response.setHeader("Content-Type", "text/html; charset=utf-8");
response.setBody("<html>");
response.setBody("<div>" + "你已经登录了" + user.userName + "</div>");
response.setBody(+ user.age + "div");
response.setBody("<div>" + user.school + "</div>");
response.setBody("</html>");
}
}
}
片
package HTTPV3;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
HttpServerV3 httpServerV3 = new HttpServerV3(80);
httpServerV3.start();
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>试验</title>
</head>
<body>
<form method="post" action="/login">
<div style="margin-bottom: 5px">
<input type="text" name="username" placeholder="请输入姓名">
</div>
<div style="margin-bottom: 5px">
<input type="password" name="password" placeholder="请输入密码">
</div>
<div>
<input type="submit" value="登陆">
</div>
</form>
</body>
</html>