博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HttpURLConnection、HttpClient和Session
阅读量:5242 次
发布时间:2019-06-14

本文共 4831 字,大约阅读时间需要 16 分钟。

原文地址:http://www.cnblogs.com/kross/p/3615695.html

 

一直没弄懂Session,cookies什么的登陆验证到底是怎么回事,昨天分别用HttpURLConnection和HttpClient两个类来实验了一下,基本弄明白了Session验证登陆的机制和这两个类的区别。

第一步:先在本地写一个登陆页面和一个内容页面(登陆了才能进去)吧。代码大致如下:

下面是login.php,用于请求登陆的,通过post传递参数,如果登陆成功就会注册session。

1 
进入网站";11 } else {12 echo "-1";13 }14 }15 ?>16 17 18
19
20
21
22
23 24

下面是content.php,会验证session,用来当网站的内容页,登陆了才能看到正确的内容。

接下来先讲HttpURLConnection这个类,先使用这个类直接请求content.php页面,理所应当的返回了"-1"。如果先用这个类去请求login.php,并传递正确的参数,就会显示登陆成功,这个时候再去用这个类请求content.php,依然是返回"-1",很显然,HttpURLConnection并没有记录我们登陆的状态,或者说服务器认识刚刚登陆成功的人,但这次请求content.php的人它依然不认识。这就说明了HttpURLConnection的每一次请求都是独立的,都是一次新的请求,或者说每一次请求都是一个新的会话(session)。

然后我就用chrome去开我自己写的那个测试的网页,发现在同一个网站下,同一次会话中,有一个sessionid是不会变的。

就是上面这个东西,如果开着某个页面,无论如何刷新,或者跳转到这个服务器下的其他网站,这个SESSIONID的值都不会改变,但是如果关掉这个服务器下的所有页面,再重新打开这样的一个页面,这个SESSIONID的值就被重新生成了。

 

于是用HttpURLConnection的情况,第一次登陆login.php是一个SESSIONID,确实登陆成功了,服务器记住的是SESSIONID为A的情况(假设是A好了),但再去请求content.php的时候,SESSIONID就不是A了,服务器就认为你没有登陆,于是就显示了“-1”。问题搞明白了,那么只需要在HttpURLConnection请求的时候,给它加上SESSIONID这个头部就行了。最终代码如下:

public class NetHelper {        /**     * SESSIONID     * */    private String sessionId = "";        /**     * 发送一条请求,将内容以字符串返回     * @param url 请求的地址     * @return 返回的内容     * */    public String request(String url) throws IOException {        URL uUrl = new URL(url);        HttpURLConnection huc = (HttpURLConnection) uUrl.openConnection();        huc.addRequestProperty("Cookie", sessionId);    //为什么是“Cookie”,Chrome打开F12自己看看就明白了        huc.connect();        BufferedReader br = new BufferedReader(new InputStreamReader(huc.getInputStream()));        String data = "";        String line = "";        while ((line = br.readLine()) != null) {             data = data + line;        }        return data;    }        /**     * 发送登陆请求,并将SESSIONID保存起来     * @param url 登陆请求的地址     * @return 返回的内容     * */    public String login(String url) throws IOException {        URL uUrl = new URL(url);        HttpURLConnection huc = (HttpURLConnection) uUrl.openConnection();                //设置请求方式        huc.setRequestMethod("POST");                //设置post参数        StringBuffer params = new StringBuffer();        params.append("username=").append("admin").append("&").append("password=").append("admin");        byte[] bytes = params.toString().getBytes();        huc.getOutputStream().write(bytes);                huc.connect();                //从headers中取出来,并分割,为什么要分割,Chrome打开F12自己看看就明白了        String[] aaa = huc.getHeaderField("Set-Cookie").split(";");        sessionId = aaa[0];                BufferedReader br = new BufferedReader(new InputStreamReader(huc.getInputStream()));        String data = "";        String line = "";        while ((line = br.readLine()) != null) {             data = data + line;        }        return data;    }}

 

接下来就是使用HttpClient,代码类似的,我做了相同的实验,结果就直接出来了,HttpClient会自动的管理Session,第二次请求不需要手动去设置Session就可以登录上。

public class NetClient {        private HttpClient client = null;         public NetClient() {        client = new DefaultHttpClient();    }        public String request(String url) throws ClientProtocolException, IOException {        HttpPost post = new HttpPost(url);        HttpResponse res = client.execute(post);                BufferedReader br = new BufferedReader(new InputStreamReader(res.getEntity().getContent()));        String data = "";        String line = "";        while ((line = br.readLine()) != null) {             data = data + line;        }        return data;    }        public String login(String url) throws ClientProtocolException, IOException {        HttpPost post = new HttpPost(url);                //设置post参数的方式还真是不人性化啊……        ArrayList
pa = new ArrayList
(); pa.add( new BasicNameValuePair( "username", "admin")); pa.add( new BasicNameValuePair( "password", "admin")); post.setEntity( new UrlEncodedFormEntity(pa, "UTF-8")); HttpResponse res = client.execute(post); BufferedReader br = new BufferedReader(new InputStreamReader(res.getEntity().getContent())); String data = ""; String line = ""; while ((line = br.readLine()) != null) { data = data + line; } return data; }}

最后总结一下,Session验证的方式是在一次会话中,为每一个客户端都生成了一个SESSIONID,如果是成功登陆的,服务器端就会记录好,登陆成功的SESSIONID,如果登陆失败或者新的SESSIONID,都将无法验证登陆,这就是SESSION验证登陆的基本情况。

而HttpURLConnection和HttpClient这两个类都可以用来网络请求,但稍有不同,HttpuRLConnection每一次请求都是新的会话,如果需要去验证SESSIONID,就必须手动的去设置Header,HttpClient就能智能的管理Session,不需要手动设置,实际上HttpClint就类似于一个程序中的小浏览器。

 

最大的槽点我觉得就是这两个类设置post参数的方式都很2B一点都不方便……

 

另外HttpClient不能同时发送两次请求,如果一个请求还没有结束或者关闭,又马上开启另一个请求。就会报警告,截个图吧

 

所以我综合考虑了下,以后还是尽量都使用HttpURLConnection吧……

 

原文地址:http://www.cnblogs.com/kross/p/3615695.html

新浪微博:

转载于:https://www.cnblogs.com/kross/p/3615695.html

你可能感兴趣的文章
.NET 使用 Office Open XML SDK2.5
查看>>
ssh配置文件简介
查看>>
为了写中秋这篇文章,我学了 20 种编程语言!
查看>>
docker基本操作
查看>>
kora 简单使用实现Api接口 以及mongodb简单使用
查看>>
WampServer中MySQL中文乱码解决
查看>>
tab栏切换
查看>>
HTML标签
查看>>
20130617—认识异常
查看>>
JAVA提高十一:LinkedList深入分析
查看>>
MPC&MAGIC
查看>>
立一个Flag吧
查看>>
tp3.2验证码
查看>>
行转列,列转行的sql
查看>>
Hibernate(五)__hql语句
查看>>
ThreadLocal管理登录信息
查看>>
Python面试题练习
查看>>
linux上挂载存储测试
查看>>
重建二叉树
查看>>
Golang教程:方法
查看>>