Cookie/session的产生原因
一次会话:客户端打开浏览器访问web程序,此时会话接通;不管发送多少次请求均视为一次会话;浏览器关闭,本次会话结束。
如奶茶店进行买五赠一的活动,此时给客户一个卡片(Cookie)。如果每次购买后在卡片记录当前的购买次数,则是cookie的数据存储方式,但数据容易被客户修改。如果在奶茶店记录每个客户的购买次数的方式,则是session的实现方式,此时奶茶店需知道每个客户编号,即通过cookie来记录对应的sessionid方式。
HTTP请求时一种无状态的请求,即两次不同的请求是相互独立的,可以保证其请求速度快。但是如login.jsp完成了登录,但是需要在index.jsp中获取其登录状态获取其登录名等信息。此时不可能让这两个页面都实现登录或者查库等,于是引入了cookie。
Cookie用于在客户端浏览器存储小量的数据,解决了index.jsp获取获取登录状态的需求。但是cookie是存储在客户端浏览器的,客户端可随意的修改,造成了数据不安全,于是有了session。
Session用于在服务器端存储客户的数据。在使用时,通过cookie中存储当前sessionid的方式,来实现多个会话之间的session的区分。
Cookie
工作流程以及特点
客户端发出http请求到服务器,服务器创建Cookie cookie = new Cookie(name,value),并通过HttpServletResponse.addCookie(cookie)方式发送到客户端并写入浏览器。下次发送http请求时,浏览器将自动携带cookie数据发送给服务器。服务器可通过HttpServletRequest.getCookies() 方式获取客户端的cookie信息。
默认情况下,其生命周期和浏览器会话一致,且是不安全的,可以被客户端修改。
一个cookie文件最大为4kb,一个web站点发送cookie不超过40个,一个浏览器最多保存300个cookie。
使用场景
cookie保存用户名
cookie保存历史浏览记录商品的id
中文参数乱码处理以及常用API
对于中文参数的传递,JDK提供 URLEncoder:编码RLDecoder:解码 进行处理。
session
工作流程
客户端发出http请求到服务器;当服务器需要为客户端创建一个session时,如果该请求中包含了一个sessionid的标识,则服务器通过sessionid检索出对应的session,进行调用;如果对应的请求中没有sessionid,服务器则为客户端建立对应的session并产生与之匹配的sessionid (不会重复难以被仿造),在本次响应时将sessionid返回到客户端(一般保存在cookie中)。
常用api以及生命周期
获取:request.getSession()//没有则创建,sessionid是从客户端请求中获取的。
session.setAttrubute(key,value) session.getAttribute(key)
Session的生命周期:创建于第一次调用getSession()时;
销毁于:session.invalidate()被销毁,session超时自动关闭,服务器非正常关闭.
在ssm架构中,可直接使用HttpSession完成session的创建,其实质是request.getSession()的调用完成的。
错误观点:只要关闭浏览器,session就消失了
由于客户端大都使用了cookie存储了sessionid;在关闭浏览器时部分cookie被清除,造成下次访问时sessionid被消失,服务器查找不到对应的session则新建session。但是对于原有的session,由于创建时大都设置了失效时间(30分钟),当服务器端发现某一个session据上次客户端调用超过了失效时间,服务器会把对应的session删除以节约资源。
故存在重启浏览器后session仍生效,但是清除缓存后失效的情况。
使用场景
图形验证码的保存获取:HttpSession session ;httpSession.setAttribute ("random", sRand);
存储登录用户的信息:如Users u = (Users)session.getAttribute("customer");