php设置session值和cookies的学习示例


Posted in PHP onMarch 21, 2014

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

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

<?php
session_start();
if (isset($_POST['username'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];
    if ($username == 'admin' && $password == 'admin') {
        $_SESSION['username'] = $username;
        echo "<a href='content.php'>进入网站</a>";
    } else {
        echo "-1";
    }
}
?>
<html>
<body>
<form action="" method="post">
<input type="text" name="username" />
<input type="password" name="password" />
<input type="submit" name="submit" value="submit" />
</form>
</body>
</html>

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

<?php
session_start();
if (isset($_SESSION['username'])) {
    echo "login ok";
} else {
    echo "not login";
}
?>

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

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

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

php设置session值和cookies的学习示例于是用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<NameValuePair> pa = new ArrayList<NameValuePair>();
        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不能同时发送两次请求,如果一个请求还没有结束或者关闭,又马上开启另一个请求。就会报警告,截个图吧

php设置session值和cookies的学习示例

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

PHP 相关文章推荐
加速XP搜索功能堪比vista
Mar 22 PHP
主流PHP框架的优缺点对比分析
Dec 25 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
Dec 18 PHP
PHP中each与list用法分析
Jan 08 PHP
PHP并发多进程处理利器Gearman使用介绍
May 16 PHP
Yii统计不同类型邮箱数量的方法
Oct 18 PHP
php图像处理函数imagecopyresampled用法详解
Dec 02 PHP
php封装一个异常的处理类
Jun 08 PHP
深入浅析PHP的session反序列化漏洞问题
Jun 15 PHP
php7基于递归实现删除空文件夹的方法示例
Jun 15 PHP
ThinkPHP开发--使用七牛云储存
Sep 14 PHP
详解php中生成标准uuid(guid)的方法
Apr 28 PHP
一个显示效果非常不错的PHP错误、异常处理类
Mar 21 #PHP
一漂亮的PHP图片验证码实例
Mar 21 #PHP
PHP中nowdoc和heredoc使用需要注意的一点
Mar 21 #PHP
php获取表单中多个同名input元素的值
Mar 20 #PHP
php中的静态变量的基本用法
Mar 20 #PHP
php遍历文件夹下的所有文件和子文件夹示例
Mar 20 #PHP
php数据库备份还原类分享
Mar 20 #PHP
You might like
PHP实现仿百度文库,豆丁在线文档效果(word,excel,ppt转flash)
2016/03/10 PHP
php版阿里云OSS图片上传类详解
2016/12/01 PHP
浅谈PHP的数据库接口和技术
2016/12/09 PHP
jQuery 获取对象 基本选择与层级
2010/05/31 Javascript
JQuery浮动DIV提示信息并自动隐藏的代码
2010/08/29 Javascript
初学js插入节点appendChild insertBefore使用方法
2011/07/04 Javascript
jQuery1.6 类型判断实现代码
2011/09/01 Javascript
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
jQuery选择器简明总结(含用法实例,一目了然)
2014/04/25 Javascript
JavaScript中Date对象的常用方法示例
2015/10/24 Javascript
JavaScript实现简单获取当前网页网址的方法
2015/11/09 Javascript
Highcharts使用简例及异步动态读取数据
2015/12/30 Javascript
javascript数据类型验证方法
2015/12/31 Javascript
react-navigation之动态修改title的内容
2018/09/26 Javascript
ES6 Symbol数据类型的应用实例分析
2019/06/26 Javascript
Vue程序化的事件监听器(实例方案详解)
2020/01/07 Javascript
js轮播图之旋转木马效果
2020/10/13 Javascript
[10:14]2018DOTA2国际邀请赛寻真——paiN Gaming不仅为自己而战
2018/08/14 DOTA
[43:24]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.12
2020/12/17 DOTA
用Python脚本生成Android SALT扰码的方法
2013/09/18 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
HTML5 Canvas的性能提高技巧经验分享
2013/07/02 HTML / CSS
Canvas高级路径操作之拖拽对象的实现
2019/08/05 HTML / CSS
玖熙女鞋美国官网:Nine West
2016/10/06 全球购物
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
经典公益广告词
2014/03/13 职场文书
材料成型及控制工程专业求职信
2014/06/19 职场文书
机械专业毕业生自我鉴定2014
2014/10/04 职场文书
后进基层党组织整改方案
2014/10/25 职场文书
毕业实习指导教师评语
2014/12/31 职场文书
2015年秋学期师德师风建设工作总结
2015/10/23 职场文书
2016年圣诞节义工活动总结
2016/04/01 职场文书
CSS实现九宫格布局(自适应)的示例代码
2022/02/12 HTML / CSS
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python
OpenCV实现常见的四种图像几何变换
2022/04/01 Python
详解OpenCV获取高动态范围(HDR)成像
2022/04/29 Python