You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
4.4 KiB
122 lines
4.4 KiB
6 years ago
|
import com.sun.net.httpserver.HttpExchange;
|
||
|
import com.sun.net.httpserver.HttpHandler;
|
||
|
import com.sun.net.httpserver.HttpServer;
|
||
|
import helper.KeyReader;
|
||
|
import helper.RSAUtils;
|
||
|
import helper.StringUtils;
|
||
|
|
||
|
import java.io.IOException;
|
||
|
import java.io.OutputStream;
|
||
|
import java.io.UnsupportedEncodingException;
|
||
|
import java.net.InetSocketAddress;
|
||
|
import java.net.URI;
|
||
|
import java.net.URLDecoder;
|
||
|
import java.util.HashMap;
|
||
|
import java.util.Map;
|
||
|
|
||
|
/**
|
||
|
* @author richie
|
||
|
* @version 10.0
|
||
|
* Created by richie on 2018-12-03
|
||
|
* http认证demo服务器
|
||
|
*/
|
||
|
public class Http {
|
||
|
|
||
|
public static void main(String... args) throws IOException {
|
||
|
HttpServer server = HttpServer.create(new InetSocketAddress(8001), 0);
|
||
|
server.createContext("/demo", new AuthHandler());
|
||
|
server.start();
|
||
|
System.out.println("Server is started, please visit:http://localhost:8001/demo");
|
||
|
}
|
||
|
|
||
|
private static class AuthHandler implements HttpHandler {
|
||
|
|
||
|
@Override
|
||
|
public void handle(HttpExchange exchange) throws IOException {
|
||
|
exchange.sendResponseHeaders(200, 0);
|
||
|
URI uri = exchange.getRequestURI();
|
||
|
Map<String, String> parameters = parserQueryText(uri.getQuery());
|
||
|
|
||
|
String data = parameters.get("data");
|
||
|
|
||
|
// (必须)http认证的地方填的是公钥,则这里需要用私钥进行解密
|
||
|
String text = RSAUtils.decrypt(data, KeyReader.getPrivateKey());
|
||
|
|
||
|
System.out.println("data:" + text);
|
||
|
|
||
|
Map<String, String> map = parserText(text);
|
||
|
|
||
|
String responseText;
|
||
|
|
||
|
// username参数是从报表登录界面输入的地方获取的
|
||
|
String username = map.get("username");
|
||
|
// password参数是从报表登录界面输入的地方获取的
|
||
|
String password = map.get("password");
|
||
|
// uuid参数是报表发送http认证请求的时候生成的随机数
|
||
|
String uuid = map.get("uuid");
|
||
|
|
||
|
if (isValidUser(username, password)) {
|
||
|
// (必须)认证成功时返回的文本格式{"success":"true","uuid":"xxx-yyy-zzz-dddd"}
|
||
|
responseText = String.format("{\"success\":\"true\",\"uuid\":\"%s\"}", uuid);
|
||
|
} else {
|
||
|
responseText = "{\"success\":\"false\"}";
|
||
|
}
|
||
|
|
||
|
System.out.println("responseText:" + responseText);
|
||
|
|
||
|
// (必须)这里需要把返回值用私钥进行加密,在报表服务器中,会自动使用公钥进行解密
|
||
|
String returnValue = RSAUtils.encrypt(responseText, KeyReader.getPrivateKey());
|
||
|
|
||
|
OutputStream os = exchange.getResponseBody();
|
||
|
os.write(returnValue.getBytes());
|
||
|
os.close();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 判断username和password是否可以正确的登录
|
||
|
* @param username 用户名
|
||
|
* @param password 密码
|
||
|
* @return 如果能正确登录,则这里返回true表示,如果不能正确登录,则这里返回false表示
|
||
|
*/
|
||
|
private static boolean isValidUser(String username, String password) {
|
||
|
if (username == null || password == null) {
|
||
|
return false;
|
||
|
}
|
||
|
// 这里只是一个示例,当用户名和密码输入一样的时候,我们假设认证成功,允许登录
|
||
|
return username.equals(password);
|
||
|
}
|
||
|
|
||
|
private static Map<String, String> parserQueryText(String query) throws UnsupportedEncodingException {
|
||
|
Map<String, String> map = new HashMap<String, String>();
|
||
|
if (query == null) {
|
||
|
return map;
|
||
|
}
|
||
|
String[] pairs = query.split("&");
|
||
|
for (String pair : pairs) {
|
||
|
int idx = pair.indexOf("=");
|
||
|
map.put(URLDecoder.decode(pair.substring(0, idx), "UTF-8"), URLDecoder.decode(pair.substring(idx + 1), "UTF-8"));
|
||
|
}
|
||
|
return map;
|
||
|
}
|
||
|
|
||
|
private static Map<String, String> parserText(String text) {
|
||
|
Map<String, String> map = new HashMap<>();
|
||
|
if (StringUtils.isEmpty(text)) {
|
||
|
return map;
|
||
|
}
|
||
|
if (text.startsWith("{") && text.endsWith("}")) {
|
||
|
String[] arr = text.substring(1, text.length() - 1).split(",");
|
||
|
for (String child : arr) {
|
||
|
String[] pair = child.split(":");
|
||
|
String key = pair[0];
|
||
|
String value = pair[1];
|
||
|
map.put(key.substring(1, key.length() - 1), value.substring(1, value.length() - 1));
|
||
|
}
|
||
|
return map;
|
||
|
} else {
|
||
|
return map;
|
||
|
}
|
||
|
}
|
||
|
}
|