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 相关文章推荐
php单件模式结合命令链模式使用说明
Sep 07 PHP
PHP 网页过期时间的控制代码
Jun 29 PHP
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
Apr 23 PHP
在PHP中利用wsdl创建标准webservice的实现代码
Dec 07 PHP
php中 $$str 中 &quot;$$&quot; 的详解
Jul 06 PHP
简介PHP的Yii框架中缓存的一些高级用法
Mar 29 PHP
php+js实现百度地图多点标注的方法
Nov 30 PHP
php数据序列化测试实例详解
Aug 12 PHP
PHP简单实现防止SQL注入的方法
Mar 13 PHP
php微信开发之音乐回复功能
Jun 14 PHP
PHP+ajax实现二级联动菜单功能示例
Aug 10 PHP
thinkphp5框架实现的自定义扩展类操作示例
May 16 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创建多级目录的方法
2015/03/24 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
2016/11/09 PHP
详解yii2使用多个数据库的案例
2017/06/16 PHP
PHP使用ActiveMQ实现消息队列的方法详解
2019/05/31 PHP
Laravel框架表单验证操作实例分析
2019/09/30 PHP
父窗口获取弹出子窗口文本框的值
2006/06/27 Javascript
Javascript调用C#代码
2011/01/17 Javascript
jQuery focus和blur事件的应用详解
2014/01/26 Javascript
javascript模拟命名空间
2015/04/17 Javascript
JavaScript检测上传文件大小的方法
2015/07/22 Javascript
基于javascript实现图片懒加载
2016/01/05 Javascript
基于jquery实现ajax无刷新评论
2020/08/19 Javascript
深入理解JavaScript中的预解析
2017/01/04 Javascript
layer弹出层中H5播放器全屏出错的解决方法
2017/02/21 Javascript
Vue2学习笔记之请求数据交互vue-resource
2017/02/23 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
2017/12/09 Javascript
Vue render深入开发讲解
2018/04/13 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
微信小程序API—获取定位的详解
2019/04/30 Javascript
JavaScript实现拖拽盒子效果
2020/02/06 Javascript
python使用xlrd与xlwt对excel的读写和格式设定
2017/01/21 Python
Python使用getpass库读取密码的示例
2017/10/10 Python
python使用opencv在Windows下调用摄像头实现解析
2019/11/26 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
2020/02/27 Python
一文了解python 3 字符串格式化 F-string 用法
2020/03/04 Python
python,Java,JavaScript实现indexOf
2020/09/09 Python
法国综合购物网站:RueDuCommerce
2016/09/12 全球购物
美国在线艺术商店:HandmadePiece
2020/11/06 全球购物
总监职责范文
2013/11/09 职场文书
优秀党支部事迹材料
2014/01/14 职场文书
运动会稿件50字
2014/02/17 职场文书
大学生自我评价范文分享
2014/02/21 职场文书
2014年重阳节活动策划方案书
2014/09/16 职场文书
文员岗位职责
2015/02/04 职场文书
z-index不起作用
2021/03/31 HTML / CSS
win10安装配置nginx的过程
2021/03/31 Servers