一、首先了解http协议
1.socket. GET请求
Socket socket = new Socket("www.baidu.com", 80);
// 请求服务器
OutputStream out = socket.getOutputStream();
PrintWriter pw = new PrintWriter(out);
pw.println("GET / HTTP/1.1"); // 请求的第一行Request-Line,
pw.println("Host: www.baidu.com"); // 请求头,Host是必须的
pw.println("User-Agent: Mozilla/5.0 (Windows NT 6.1; IE 9.0)"); //请求的机器信息
//
//pw.println("Content-Type: application/x-www-form-urlencoded");
pw.println();//最后一行是空的信息
pw.flush(); // 提交请求
// 获取服务器响应
InputStream is = socket.getInputStream();
InputStreamReader reader = new InputStreamReader(is);
// 输出响应内容
while (true) {
System.out.print((char)reader.read());
}
2.socket POST的时候参数 这个还没确定
pw.println("Content-Type: application/x-www-form-urlencoded");
pw.println("Content-Length: length
pw.println();
pw.println("---------------"); //
3.SSL/TLS HTTPS
// 自定义的管理器
X509TrustManager xtm = new DefaultTrustManager();
TrustManager mytm[] = { xtm };
// 得到上下文
SSLContext ctx = SSLContext.getInstance("SSL");
// 初始化
ctx.init(null, mytm, null);
// 获得工厂
SSLSocketFactory factory = ctx.getSocketFactory();
// 从工厂获得Socket连接
// String url="https://kyfw.12306.cn/otn/leftTicket/init";
Socket socket = factory.createSocket("kyfw.12306.cn", 443);
// 剩下的就和普通的Socket操作一样了
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out.write("GET /otn/leftTicket/init HTTP/1.1\r\n");
out.write("Host: kyfw.12306.cn\r\n"); // 请求头,Host是必须的
out.write("User-Agent: Mozilla/5.0 (Windows NT 6.1; IE 9.0)\r\n"); //请求的机器信息
out.write("\r\n");
out.flush();
System.out.println("start work!");
String line;
StringBuffer sb = new StringBuffer();
while ((line = in.readLine()) != null) {
sb.append(line + "\n");
}
out.close();
in.close();
System.out.println(sb.toString());
二、首先下个HttpClient来
1.找了个3.0的HttpClient,4的感觉还用不来,先这样吧
2.基本的get用法效果
public static void main(String[] args) {
HttpClient client=new HttpClient();
int result=0;
try {
// GetMethod get=new GetMethod("http://www.baidu.com");
// int result=client.executeMethod(get);
// System.out.println("访问结果:"+result);
GetMethod get=new GetMethod("https://kyfw.12306.cn/otn/leftTicket/init");
result=client.executeMethod(get);
System.out.println("访问结果:"+result);
} catch (IOException e) {
e.printStackTrace();
}
这里面大致有两个问题来
1.正常的http可以访问的,
有些 有些https://github.com/ 居然也返回200了 这个下面再了解来
2.像上面的这个https访问直接异常了
三、证书的
最终感觉就是证书是个第三方公认的机构然后去买的
了解点实际的
//证书管理 自定义实现 里面有三个方法
class DefaultTrustManager implements X509TrustManager{
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
// TODO Auto-generated method stub
}
@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
// TODO Auto-generated method stub
}
@Override
public X509Certificate[] getAcceptedIssuers() {
// TODO Auto-generated method stub
return null;
}
X509Certificate
遍历验证获取证书内容,证书的有效性和检测
四、使用
不仅可以用来访问认证
也可以用来进行跨域的转发