cookie - session
最近工作上在和原生开发者联合开发一个SDK,SDK是原生和H5混编的,需要我这边后台去设置cookie来验证用户信息和用户的登录状态。之前使用cookie是在用别人写的轮子,这次需要自己动手去造轮子,实际开发中,才发现自己其实web基础还是不扎实,对cookie(包括session)的理解是浮在表面的,所以这次借5.1假期,花时间来学习总结下,并且将内容记录下路,方便自己以后复兴回顾。。。
1.cookie
cookie是用来保存会话信息的。因为http是无状态协议,当第一次请求断开,同一个用户再请求第二次的时候,如果没有这种会话机制,服务端就根本无法识别这用户。会话机制其实是对http协议的补充和扩展,cookie和sesion就是会话机制的主要构成,cookie是保存在客户端,session是保存在服务端,虽然保存地方不一样,但是两者的内容都是服务端来决定的。
一般实际场景中,使用cookie的流程是这样:
Step1:客户端请求服务端登录接口。
Step2:服务端去进行登录验证,如果登录验证通过,将登录信息作为发起该次请求的客户端的唯一标识,并将该信息设置为cookie的值,返回给客户端。这个cookie信息就响应头里Set_Cookie。
Step3:客户端拿到服务端给自己分配好的“ID”,那么以后每次再请求服务端,都会带上cookie,cookie值就是请求头里的Cookie。
一般实际操作中,只要在服务端造一个给reposnse添加cookie的轮子就可以。
cookie轮子代码:
public void setCookie(HttpServletResponse resp, Map<String, ?> params) { if (params == null || params.isEmpty()) { return; } Set<String> keySet = params.keySet(); Object obj = null; Cookie cookie = null; for (String key : keySet) { obj = params.get(key); if (obj != null && obj.getClass().isAssignableFrom(Cookie.class)) { cookie = (Cookie) obj; } else { cookie = new Cookie(key, URLEncoder.encode((String) params.get(key))); } cookie.setMaxAge(60 * 60 * 24 * 30); // 设定有效时间 cookie.setPath("/"); resp.addCookie(cookie); } }
cookie还有可以用来浏览器行为追踪(分析用户浏览器行为)和个性化设置(用户浏览器自定义设置,主题等)。
单纯的对于客户端而言,cookie其实还可以用来进行本地存储,但是如果客户端每次请求都是带着cookie中的数据,那么就会有额外的性能开销,尤其是移动端,而且现在有关本地web存储数据的API也开始多了,比如h5新增的localstorage和sessionstorage。。
cookie的web API接口:https://developer.mozilla.org/zh-CN/docs/Web/API/Document/cookie
2.session
session从头到尾都是数据服务端的,它是保存在服务端的“用户标识”。每一个客户端在成功请求服务端后,服务端都要给客户端生成一个id,这个id会以cookie的形式再返回给客户端,这样客户端在之后的请求时,都会带上这个sessionId,服务端根据这个ID来定位保存在服务端的客户端信息。
以jsp页面举例,如果cookie里面没有sessionId,那么jsp会默认创建一个session,jsp默认标签<%@ page session = true %>。并且把sessionId添加到cookie中去。
至于在服务端创建session,只要引入了javax.servlet.http的jar包,直接创建HttpSession对象即可。如果是Sevelet中,也会自动去创建session。HttpSession session = request.getSession();强制session,getAttribute(Stringkey)和setAttribute(String key,Objectvalue)方法读写session。session是以键值对的形式来保存数据的。
session API http://docs.sqlalchemy.org/en/latest/orm/session_api.html
session的作用和cookie类似,使用上比cookie要简答些,但是会增加服务端的压力。一般session 会保存在jvm中,这样读写速度会很快,但是一旦数据量庞大了,会需要很大的堆空间,现在有一种新的服务解决方案,就是独立保存Http Session的信息——Spring Session 链接:http://www.infoq.com/cn/articles/Next-Generation-Session-Management-with-Spring-Session 。
3 URL重写
url重写是对浏览器不支持cookie,或者cookie被手动关闭的解决方案,在我这次的实际开发中并没有碰到这种情况,但是说不定以后会碰到,这里把代码贴出来
HttpServletResponse类提供了encodeURL(Stringurl)实现URL地址重写
<td>
<a href="<%=response.encodeURL("index.jsp?c=1&wd=Java") %>">
Homepage</a>
</td>
还有重定向的
<% response.sendRedirect(response.encodeRedirectURL(“administrator.jsp”)); return; %>
当然可以使用一些框架封装好的href功能,或者是jst标签。。。。。通过重写会帮你判断浏览器器是否支持cookie,如果不支持,会将sessionId的值拼接到url后面,传递给服务端。
以上只是对cookie和session的个人角度的简单的概述,一些很重要的API方法都只是贴出了链接,只是把概念尽量阐述粗来,毕竟代码也是优秀设计思想的具体展现,我以为理解背后思想才是最终重要的。