web中实现session的机制有两种:
1.通过cookie来实现
所谓通过cookie来实现,说白了就是在创建了session之后,把sessionId写入到cookie文件中,之后用户在发送请求的时候,服务器会去cookie中拿session。
2.通过url重写来实现
如果用户禁用了cookie,第一种方法就行不通了。这时就会用到第二种方法。所谓url重写,其实意思就是把sessionid放入到请求的url之后,就是每一次把sessionid显示到url后面,带到服务器后,通过sessionId找到服务器中的session对象。
方法就是催对请求的url进行处理,response.encodeURL(url),使用这个方法,、
一是可以对url进行编码,就是把url中的中文转码成浏览器地址栏中%%什么的,如果url中没有中文,则什么也不干;
二就是我们说的,可以把sessionId加入到url中。
Android中的session机制
android中的session其实道理是一样的,只不过在处理方法上有所不同。理清一下思路:当客户端发送登录请求后,第一次肯定是不会有session的,到达服务器之后,服务器可以为这个特定的客户端创建session:
- HttpSession session = request.getSession(true); //创建session
- session.setAttribute("uid", user.getUid()); //session中放入id
上面true代表了如果已经创建了session了,则去找这个session,如果没有创建,就为其创建一个session,
第二句就是在该session中放入和该用户相关的信息。那么这个session就和这个用户一一对应,服务器就靠这个来识别用户身份。
其实前面服务器端和web应用都是一样的,但是在客户端:
因为android手机端在访问web服务器时,没有给http请求头部设置sessionID,而使用web浏览器作为客户端访问服务器时,在客户端每次发起请求的时候,都会将交互中的sessionID:JSESSIONID设置在Cookie头中携带过去,服务器根据这个sessionID获取对应的Session,而不是重新创建一个新Session(除了这个Session失效)。
以Java.NET.HttpURLConnection发起请求为例:
- 获取Cookie:
- 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:
- if(sessionid != null) {
- con.setRequestProperty("cookie", sessionid);
- }
这样的话就可以将服务器分配给客户端的sessionId取到了,在客户端发送请求的时候带上这个sessionid,服务器会根据这和sessionId自动搜索session,这样就保证了服务器和客户端在同一个会话中。
参考:http://blog.csdn.Net/dacainiao007/article/details/9234585
http://my.oschina.net/janson2013/blog/111050