黑马程序员技术交流社区
标题:
Cookie和Session
[打印本页]
作者:
GY_qiyue
时间:
2018-7-3 10:09
标题:
Cookie和Session
1.Cookie
会话技术
用户打开一个浏览器访问页面,访问网站的很多页面,访问完成后将浏览器关闭的过程称为是一次会话。
常见的会话技术:
Cookie:将数据保存到客户端浏览器
Session:将数据保存到服务器端
私有的数据、购物信息等数据会保存在会话技术中
Cookie技术的使用
向浏览器保存数据:
HttpServletResponse可以调用方法:
void addCokie(Cookie cookie);
获得浏览器带过来的Cookie:
HttpServletRequest有一个方法:
Cookie[] getCookies();
创建一个Cookie对象:
Cookie(String name, String value);
Cookie的常用API:
getName():获取cookie的名称
getValue():获取cookie的值
setPath(String path):设置cookie的有效路径,浏览器访问的路径包含该path,浏览器就会自动携带cookie发送到服务器,反之就不会
setMaxAge(int maxAge):设置Cookie的有效时间 --- 单位是秒
Cookie的分类:
会话级别的Cookie:默认的Cookie,关闭浏览器cookie就会消失
持久级别的Cookie:可以设置Cookie的有效时间,那么关闭浏览器Cookie还会存在
删除Cookie:
创建一个同名的cookie
new Cookie("cookie名","XXX");
设置cookie的有效访问路径(与要删除的cookie路径保持一致)
cookie.setPath(/路径名);
设置cookie的有效时间---0
cookie.setMaxAge(0);
返回浏览器
response.addCookie(cookie);
案例:
获取用户上次登录的时间
//获取cookie
Cookie[] cookies = request.getCookies();
Cookie cookie = CookieUtils.getCookie(cookies, "lastTime");
if(cookie == null){
//用户第一次登录
response.getWriter().println("您是第"+count+"位登录的会员");
}else{
//用户再次登录
response.getWriter().println("您是第"+count+"位登录的会员,"+"您上次登录时间是:"+cookie.getValue());
}
Cookie cookie2 = new Cookie("lastTime",new Date().toLocaleString());
//设置cookie有效时间
cookie2.setMaxAge(60*60);
//返回浏览器--向浏览器保存数据
response.addCookie(cookie2);
记录用户的浏览信息
//接收商品的id
String id = request.getParameter("id");
//获得所有的cookie
Cookie[] cookies = request.getCookies();
//是否是第一次浏览商品
Cookie cookie = CookieUtils.getCookie(cookies, "history");
if(cookie == null){
Cookie c = new Cookie("history",id);
c.setMaxAge(60*60*24);
c.setPath("/web16");
response.addCookie(c);
}else{
//是否是第一次浏览该商品
String value = cookie.getValue();
String[] strs = value.split("-");
//把字符串数组转化成LinkedList集合--方便操作数据
LinkedList<String> linkedlist = new LinkedList<String>(Arrays.asList(strs));
if(linkedlist.contains(id)){
//浏览过该商品
linkedlist.remove(id);
linkedlist.addFirst(id);
}else{
//未浏览过该商品
if(linkedlist.size()<3){
//没有超过最大长度
linkedlist.addFirst(id);
}else{
//已达到最大长度
linkedlist.removeLast();
linkedlist.addFirst(id);
}
}
//内容修改后,要返回
StringBuffer sb = new StringBuffer();
for (String list : linkedlist) {
sb.append(list+"-");
}
String s = sb.toString().substring(0,sb.length()-1);
Cookie c = new Cookie("history",s);
c.setPath("/web16");
c.setMaxAge(60*60*24);
response.addCookie(c);
}
2. Session
Session概述
服务器端会话技术,将数据保存在服务器端,并且没有大小和个数的限制,而Cookie是有限制的
Session的执行原理:基于Cookie的
使用Session:
创建/获取:
request.getSession();
设置session:
setAttribute(String name, Object value);
获取session值:
Object getAttribute(String name);
移除:
removeAttribute(String name);
案例:将商品加入购物车
//session Map<String,Integer>购物车 名字和数量
//响应编码格式
response.setContentType("text/html;charset=utf-8");
//接收get方式提交的商品名称
String name = request.getParameter("name");
//中文处理
name = new String(name.getBytes("iso-8859-1"),"utf-8");
//先看购物车里有没有商品
HttpSession session = request.getSession();
Map<String,Integer> map = (Map<String,Integer>)session.getAttribute("ket");
if(map == null){
//购物车为空
map = new LinkedHashMap<String,Integer>();
map.put(name, 1);
}else{
//购物车不为空
if(map.containsKey(name)){
//购物车已有此商品
int count = map.get(name);
count++;
map.put(name, count);
}else{
//购物车没有此商品
map.put(name, 1);
}
}
4. 将购物车信息,保存到session中
session.setAttribute("ket", map);
Session域对象
创建:服务器第一次调用getSession()创建session
销毁:三种情况销毁session:
session过期:默认过期时间为30分钟
非正常关闭服务器。如果正常关闭关闭服务器,session序列化到硬盘
手动调用session.invalidate().
作用范围:多次请求---一次会话
案例:一次性验证码
校验程序
String code = request.getParameter("code");
String codeImg = (String)request.getSession().getAttribute("code");
//清除code--防止重复提交
request.getSession().removeAttribute("code");
if(!code.equalsIgnoreCase(codeImg)){
request.setAttribute("err", "验证码错误,请重试!!!");
//请求转发
request.getRequestDispatcher("/login/login.jsp").forward(request, response);
}else{
...
使用js控制图片切换
<script type="text/javascript">
function changeImg(){
document.getElementById("img1").src="/web16/CheckImgServlet?time="+new
Date().getTime();
}
</script>
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2