您现在的位置: 万盛学电脑网 >> 程序编程 >> 网络编程 >> php编程 >> 正文

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

作者:佚名    责任编辑:admin    更新时间:2022-06-22

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

第一步:先在本地写一个登陆页面和一个内容页面(登陆了才能进去)吧。代码大致如下:   下面是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 = "";   &n