手机版

php中设置会话值和cookies的学习示例

时间:2021-11-09 来源:互联网 编辑:宝哥软件园 浏览:

第一步:首先在本地写一个登录页面和一个内容页面(只有登录后才能进入)。代码大致如下:下面是一个login.php,用来请求登录,通过post传递参数。如果登录成功,将注册会话。复制代码如下: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 '/Type=' submit ' name=' submit ' value=' submit '/form/body/html以下是content.php,它验证会话并用作网站的内容页面。只有登录才能看到正确的内容。复制代码如下:PHP session _ start();if(isset($ _ SESSION[' username ']){ echo ' log in ok ';} else { echo“未登录”;}?接下来,让我们谈谈类HttpURLConnection。首先,使用这个类直接请求content.php页面,它应该已经返回了“-1”。如果您使用这个类首先请求login.php并传递正确的参数,它将显示登录成功。此时,如果您使用这个类再次请求content.php,它仍然返回“-1”。很明显,HttpURLConnection没有记录我们的登录状态,或者服务器知道刚刚成功登录的人,但是它仍然不知道这次请求content.php的人。这表明HttpURLConnection的每个请求都是独立的,并且是一个新的请求,或者说每个请求都是一个新的会话。然后我用chrome打开自己写的测试的网页,发现在同一个网站下,同一个对话中,有一个sessionid是不会变的。这是上面的事情。如果您打开一个页面,无论如何都要刷新它,或者跳转到此服务器下的其他网站,此SESSIONID的值不会改变。但是,如果您关闭此服务器下的所有页面并重新打开此类页面,将重新生成此SESSIONID的值。

于是用http网址连接的情况,第一次登陆login.php是一个SESSIONID,确实登陆成功了,服务器记住的是SESSIONID为A的情况(假设是A好了),但再去请求content.php的时候,SESSIONID就不是A了,服务器就认为你没有登陆,于是就显示了"-1"。问题搞明白了,那么只需要在http网址连接请求的时候,给它加上SESSIONID这个头部就行了。最终代码如下:复制代码代码如下:公共类NetHelper { /** * SESSIONID * */私有String sessionId=/** *发送一条请求,将内容以字符串返回* @param url请求的地址* @返回返回的内容* */公共字符串请求(字符串url)引发IOException { URL uUrl=新网址(网址);HttpURLConnection huc=(HttpURLConnection)uurl。open connection();huc.addRequestProperty('Cookie ',会话id);//为什么是"饼干",铬合金打开F12自己看看就明白了哈克。connect();buffere reader br=new buffere reader(new InputStreamReader(huc。getinputstream()));字符串数据=' ';字符串行=' ';while ((line=br.readLine())!=null) {数据=数据线;}返回数据;} /** * 发送登陆请求,并将SESSIONID保存起来* @param url登陆请求的地址* @返回返回的内容* */公共字符串登录(字符串url)引发IOException { URL uUrl=新网址(网址);HttpURLConnection huc=(HttpURLConnection)uurl。open connection();//设置请求方式哈克。setrequest方法(' POST ');//设置邮政参数StringBuffer params=new StringBuffer();params.append('username=').追加(“管理员”).追加("")。追加(“密码=”).追加(“admin”);byte[] bytes=params.toString().getBytes();huc.getOutputStream().写入(字节);哈克。connect();//从头球中取出来,并分割,为什么要分割铬合金打开F12自己看看就明白了string[]AAA=huc。GetHeaderfield(' Set-Cookie ').拆分(';');会话id=AAA[0];buffere reader br=new buffere reader(new InputStreamReader(huc。getinputstream()));字符串数据=' ';字符串行=' ';while ((line=br.readLine())!=null) {数据=数据线;}返回数据;}}接下来就是使用HttpClient,代码类似的,我做了相同的实验,结果就直接出来了,HttpClient会自动的管理会话,第二次请求不需要手动去设置会议就可以登录上。复制代码代码如下:公共类NetClient {私有HttpClient client=nullpublic NetClient(){ client=new Defaulthttpclient();}公共字符串请求(字符串url)引发ClientProtocolException,IOException { httpset post=new httpset(URL);HttpResponse RES=客户端。执行(发布);BufferedReader br=new BufferedReader(new InputStreamReader(RES . get entity().getContent()));字符串数据=' ';字符串行=' ';while ((line=br.readLine())!=null) {数据=数据线;}返回数据;}公共字符串登录(字符串url)抛出ClientProtocolException,IOException { httpset post=new httpset(URL);//设置邮政参数的方式还真是不人性化啊……ArrayList名称值对pa=新的ArrayList名称值对();爸爸。add(新的basicnamevalue对(' username ',' admin '));pa.add(新的base cnamevaluepair(' password ',' admin ');post.setEntity(新的UrlEncodedFormEntity(pa,' UTF-8 ');HttpResponse RES=客户端。执行(发布);BufferedReader br=new BufferedReader(new InputStreamReader(RES . get entity().getContent()));字符串数据=' ';字符串行=' ';while ((line=br.readLine())!=null) {数据=数据线;}返回数据;}}最后总结一下,会话验证的方式是在一次会话中,为每一个客户端都生成了一个SESSIONID,如果是成功登陆的,服务器端就会记录好,登陆成功的SESSIONID,如果登陆失败或者新的SESSIONID,都将无法验证登陆,这就是会议验证登陆的基本情况。

这两个类,HttpURLConnection和HttpClient,可以用于网络请求,但它们略有不同。http连接的每个请求都是一个新的会话。如果需要验证SESSIONID,则必须手动设置Header,HttpClient无需手动设置即可智能管理会话。事实上,HttpClint类似于程序中的小浏览器。最大的槽点,我觉得是这两个类设置post参数的方式很2B,一点都不方便……另外,HttpClient不能同时发送两个请求,如果一个请求没有完成或者关闭,另一个请求会立即打开。给个警告,剪张照片就行了

所以综合考虑后,我以后会尽量使用HttpURLConnection。

版权声明:php中设置会话值和cookies的学习示例是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。