首页 文章 精选 留言 我的

精选列表

搜索[Unicode通信],共10000篇文章
优秀的个人博客,低调大师

Android -- 与WEB交互在同一个会话Session中通信

Session与Cookie Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力。 Session可以用Cookie来实现,也可以用URL回写的机制来实现。 Cookie和Session有以下明显的不同点: 1)Cookie将状态保存在客户端,Session将状态保存在服务器端; 2)Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies。 3)Session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是不同用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器; 4)就安全性来说:当你访问一个使用session 的站点,同时在自己机器上建立一个cookie,建议在服务器端的SESSION机制更安全些.因为它不会任意读取客户存储的信息。 Session Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。 当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。 Session 1)使用Cookie来实现 服务器给每个Session分配一个唯一的JSESSIONID,并通过Cookie发送给客户端。 当客户端发起新的请求的时候,将在Cookie头中携带这个JSESSIONID。这样服务器能够找到这个客户端对应的Session。 2)使用URL回显来实现 URL回写是指服务器在发送给浏览器页面的所有链接中都携带JSESSIONID的参数,这样客户端点击任何一个链接都会把JSESSIONID带给服务器。 如果直接在浏览器中输入url来请求资源,Session是匹配不到的。 Tomcat对 Session的实现,是一开始同时使用Cookie和URL回写机制,如果发现客户端支持Cookie,就继续使用Cookie,停止使用URL回写。如果发现Cookie被禁用,就一直使用URL回写。jsp开发处理到Session的时候,对页面中的链接记得使用 response.encodeURL() 。 手机端与服务器交互没有实现在同一session下? 原因很简单,就是因为android手机端在访问web服务器时,没有给http请求头部设置sessionID,而使用web浏览器作为客户端访问服务器时,在客户端每次发起请求的时候,都会将交互中的sessionID:JSESSIONID设置在Cookie头中携带过去,服务器根据这个sessionID获取对应的Session,而不是重新创建一个新Session(除了这个Session失效)。 Code(1) HttpURLConnection实现 URL url = new URL(requrl); HttpURLConnection con= (HttpURLConnection) url.openConnection(); // 取得sessionid. String cookieval = con.getHeaderField("set-cookie"); String sessionid; if(cookieval != null) { sessionid = cookieval.substring(0, cookieval.indexOf(";")); } //sessionid值格式:JSESSIONID=AD5F5C9EEB16C71EC3725DBF209F6178,是键值对,不是单指值 发送设置cookie: URL url = new URL(requrl); HttpURLConnectioncon= (HttpURLConnection) url.openConnection(); if(sessionid != null) { con.setRequestProperty("cookie", sessionid); } Code(2) HttpClient 单例模式实现 只要存在一个HttpClient对象就可以了,这个HttpClient对象中就包含得有Cookie信息。 我在工程中是使用的单例模式实现的: public class Client { private static HttpClient instance = null; private Client() { } public static HttpClient getInstance() { if (instance == null) { return instance = new DefaultHttpClient(); } else { return instance; } } } class myThread extends Thread { @Override public void run() { try { HttpClient client = Client.getInstance(); String path = "http://192.168.1.4/zxx/test.php"; HttpPost httpPost = new HttpPost(path); List<NameValuePair> param = new ArrayList<NameValuePair>(); param.add(new BasicNameValuePair("phonenumber", "18200000000")); httpPost.setEntity(new UrlEncodedFormEntity(param, "utf-8")); HttpResponse response = client.execute(httpPost); int code = response.getStatusLine().getStatusCode(); if (code == 200) { InputStream is = response.getEntity().getContent(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int len = 0; byte[] buffer = new byte[1024]; while ((len = is.read(buffer)) != -1) { baos.write(buffer, 0, len); } is.close(); baos.close(); byte[] result = baos.toByteArray(); String SysOut = new String(result, "utf-8"); System.out.println(SysOut); } else { System.out.println("code----------->" + code + ""); } } catch (Exception e) { e.printStackTrace(); }finally { } super.run(); } } class myThread2 extends Thread { @Override public void run() { try { HttpClient client = Client.getInstance(); String path = "http://192.168.1.4/zxx/test1.php"; HttpPost httpPost = new HttpPost(path); List<NameValuePair> param = new ArrayList<NameValuePair>(); param.add(new BasicNameValuePair("phonenumber", "18200000000")); HttpResponse response = client.execute(httpPost); int code = response.getStatusLine().getStatusCode(); if (code == 200) { InputStream is = response.getEntity().getContent(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int len = 0; byte[] buffer = new byte[1024]; while ((len = is.read(buffer)) != -1) { baos.write(buffer, 0, len); } is.close(); baos.close(); byte[] result = baos.toByteArray(); String SysOut = new String(result, "utf-8"); System.out.println(SysOut); } else { System.out.println("code----------->" + code + ""); } } catch (Exception e) { e.printStackTrace(); } super.run(); } } 两个线程中就可以使用同一个cookie访问了。 Code(3) SeesionId Url传递实现 通过将SessionId的值通过url传递到想继续在同一会话中访问的页面。 php代码:test2.php <?php session_start(); header("Content-type:text/html;charset=utf-8"); if(isset($_POST['phonenumber'])) { $phone = $_POST['phonenumber']; if(!isset($_SESSION['phone'])) { $time=time()+60*10*10;//100分钟 $_SESSION['phone'] = $phone; echo session_id(); } else echo "POST phone already exist"; } if(isset($_GET['phonenumber'])) { $phone = $_GET['phonenumber']; if(!isset($_SESSION['phone'])) { $time=time()+60*10*10;//100分钟 $_SESSION['phone'] = $phone; echo session_id(); } else echo "GET phone already exist"; } ?> test3.php Session_id($_GET['id']); session_start(); header("Content-type:text/html;charset=utf-8"); if(isset($_POST['phonenumber'])) { $phone = $_POST['phonenumber']; echo "phone-->".$phone."<br />"; echo "_SESSION[phone]-->".$_SESSION['phone']."<br />"; echo "SESSIONid--->".session_id(); if($_SESSION['phone'] == $phone) echo "POST 验证 OK"; else echo "POST 验证 BAD"; } if(isset($_GET['phonenumber'])) { $phone = $_GET['phonenumber']; echo "phone-->".$phone."<br />"; echo "_SESSION[phone]-->".$_SESSION['phone']."<br />"; echo "session_id--->".session_id(); if($_SESSION['phone'] == $phone) echo "GET 验证 OK"; else echo "GET 验证 BAD"; } Android上的代码(这里我们分别new两个HttpClient做测试): class myThread extends Thread { @Override public void run() { try { client = new DefaultHttpClient(); String path = "http://192.168.1.4/zxx/test.php"; HttpPost httpPost = new HttpPost(path); List<NameValuePair> param = new ArrayList<NameValuePair>(); param.add(new BasicNameValuePair("phonenumber", "18200000000")); httpPost.setEntity(new UrlEncodedFormEntity(param, "utf-8")); HttpResponse response = client.execute(httpPost); int code = response.getStatusLine().getStatusCode(); if (code == 200) { InputStream is = response.getEntity().getContent(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int len = 0; byte[] buffer = new byte[1024]; while ((len = is.read(buffer)) != -1) { baos.write(buffer, 0, len); } is.close(); baos.close(); byte[] result = baos.toByteArray(); String SysOut = new String(result, "utf-8"); System.out.println(SysOut); seesionId = SysOut; } else { System.out.println("code----------->" + code + ""); } } catch (Exception e) { e.printStackTrace(); }finally { } super.run(); } } class myThread2 extends Thread { @Override public void run() { try { client = new DefaultHttpClient(); String path = "http://192.168.1.4/zxx/test1.php?id="+seesionId; HttpPost httpPost = new HttpPost(path); List<NameValuePair> param = new ArrayList<NameValuePair>(); param.add(new BasicNameValuePair("phonenumber", "18200000000")); httpPost.setEntity(new UrlEncodedFormEntity(param, "utf-8")); HttpResponse response = client.execute(httpPost); int code = response.getStatusLine().getStatusCode(); if (code == 200) { InputStream is = response.getEntity().getContent(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int len = 0; byte[] buffer = new byte[1024]; while ((len = is.read(buffer)) != -1) { baos.write(buffer, 0, len); } is.close(); baos.close(); byte[] result = baos.toByteArray(); String SysOut = new String(result, "utf-8"); System.out.println(SysOut); } else { System.out.println("code----------->" + code + ""); } } catch (Exception e) { e.printStackTrace(); } super.run(); } } Session_id($_GET['id']); 这句话很重要。 我是天王盖地虎的分割线 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3914177.html,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册