笔记之Servlet的会话管理技术(cookie、session)(应用:用户自动登录、防表单重复提交)
2013-03-18 11:46
741 查看
会话管理: cookie 和Session都是Servlet技术
会话:从浏览器打开到关闭的访问过程。
会话管理:是实现多个WEB页面(超链接)的数据共享。典型应用:购买页面的数据和支付页面的数据共享。
为什么不用request和servletContext实现呢?
不同的页面是不同的请求,不同的request
servletContext面多多个用户有并发问题
解决数据共享有2个方案:Cookie和session
Cookie是客户端技术,服务器将用户的数据发送给浏览器,写到IE缓存中。再次访问时则会带着COOKIE 数据去访问。
Session:是服务器技术,服务器为每一个用户创建一个独享的Session对象(默认情况下),将用户数据存在Session 中,存放在服务器上,下次访问时,服务器会把Session 数据打给浏览器
Cookie:
构造函数:Cookie(String name,String value);
addCookie(Cookie cookie);发送Cookie
getCookies();获取Cookie,所有的
setMaxAge(),getMaxAge()设置和获取有效期,单位是秒(默认是浏览器关闭则清除Cookie),setMaxAge(0)是删除Cookie
setValue(),getValue() 封装和获取cookie 中的数据
setPath(),getPath()设置和获取有效路径(这个cookie 在访问服务器的什么路径时会带Cookie)
setDomain(),getDomain(访问什么域名时带cookie去如.sina.com.cn)域名和WEB资源要对应,否则被认为第三方COOKIE会被浏览器阻止
浏览器第一次访问时, cookie为空,小心空指针
Cookie应用:显示上次访问时间
假设已经存有一个名字为lastAccessTime的Cookie
//获取上次的访问时间
Cookie[] cookies=request.getCookies();
For(int i=0;cookies!=null&&i<cookies.length;i++){
Cookie cookie=cookies[i];
If(cookie.getName().equals("lastAccessTime")){
Long time=Long.parseLong(cookie.getValue());
Date d=new Date(time);
response.getWriter().write(d.toLocalString());
}
}
//记录这次的访问时间
Cookie cookie=
new Cookie("lastAccessTime",System.CurrentTimeMilles()+"")
cookie.setMaxAge(3600);
response.addCookie(cookie);
Cookie细节:
一个Cookie只能表示一种信息,是一个键值对。Nam,value
一个浏览器一般允许存放300个Cookie,每个WEB站点,最多存放20个Cookie,每个Cookie 最大为4KB
setMaxAge(0)删除Cookie,新建的cookie 名字和Path 要相同。
setPath("/day07") 是通知浏览器带COOKIE /代表网站
Cookie应用:显示上次浏览过的商品
修改原有的 COOKIE ,把最新的 cookie带给服务器
首页 servlet:显示所有商品,浏览记录
另一个servlet:根据ID显示商品的详细信息,发送Cookie
数据类:需要检索用map,key是ID,,不需要用list
构建Cookie值要注意顺序和ID个数。比较复杂。
Session:
Session由服务器创建。第一次调用request.getSession()时创建 Session.只创建一个,session的销毁由服务器控制。默认30分钟
设置session有效时间:
通过 web.XML配置,单位分钟
<session-config>
<session-timeout>5</session-timeout>
</session-config>
编程方式:
Session.invalidate();让访问者的session失效
Session案例:简单的购物功能
原理:服务器是怎样实现一个session为一个用户浏览器服务的?
getSession()会穿件一个带ID的session.服务器会把session的id以cookie的形式写给浏览器。下次访问时getSession()会带着ID去找相应的session
为保证浏览器关闭,cookie依然存在,需要重新设置有效期
Cookie cookie=new Cookie("JESSIONID",session.getId);
cookie.setMaxAge(30*60);
cookie.setPath("/day07");
response.addCookie(cookie);
如果用户禁用了cookie:
再次访问时,getSession()会创建全新的session。无法获取原来的数据
解决办法:URL地址重写 ,创建session时返回的ID,会带在地址后面
encodeUrl()重写URL地址 (重写方法,第一次不管是否支持COOKIE都重写,后面如果发现浏览器支持COOKIE就不会重写。)
encodeRedirectUrl()重写重定向地址
如:买书跳转到支付页面,购买页面的sessionid会带在跳转地址后面,从而将买的书带到支付页面。
要多有的地址都重写,否则,每次只能买到一本。还要getSession()获取ID,然后重写
String url="/day06/RedirectServlet"
Url=response.encodeRedirectURL(url);
response.sendRedirect("url");
浏览器关闭,记录就消失。
Session案例:用户登录
原理:如果用户密码和数据库匹配,则在session中存一个已登录标记。同一次会话中,访问不在用登陆。
Session案例:防止表单重复提交
2种方式:
前台:javaScript
服务器:表单不直接交给浏览器,而是由一个servlet生成并交给浏览器, servet生成表单表单给用户的时候会附加一个随机数,然后把表单给用户,同时把随机数存到session中,用户提交时只有表单随机数和session中随机数一致才能提交,提交之后,这个随机数就从session中移除,重复提交,则带的是用过的随机数(没有重新生成表单,随机数也不会重新生成),session中没有对应的随机数,不能通过。
(就是hiden隐藏域添加一个令牌随机数)
随机数要由一个单独的对象生成(单例)。多个对象的话,随机数会重复
数据不管多大,数据指纹一样大,128位,不同的数据,不同的数据指纹
Md5算法:产生消息摘要,不可逆(特殊情况:2个数据的md5碰巧一样,可以得到原始数据)md5 编码后,会变成一个128为的数字
Md5 应用:密码加密与服务器的密码md5 码对比,网银客户端自动md5码对比防病毒,光盘数据检验生成MD5 码检验数据完好性
Base64算法:把3字节变4字节,防止乱码
原理:24位3个变24位4个,每个字节6个有效位,最高位补2个0,则最大数63,最小数0,所以称base64,对应64个键盘字符ABCD.....=
经过base64编码,会变成字母和符号组成的字符串。不会乱码
换行:浏览器用是br,其他用是\r\n
Session案例:注册验证码服务器验证
将验证码生成图片时的字符存到session中,用户提交时验证码和session中字符对比,一致则接受。
补充:day07感想:
注册,登陆,直接request.getSession().setAttribute("user",user);会自动校验是否已登陆。
防止表单重复提交:
直接用验证码
用一个servlet调用工具类方法得到验证码图片和字符,将字符存入session,将图片写出。表单上img标签引用这个servlet获得输出的图片。
提交时,比较2个的字符是否一致。
会话:从浏览器打开到关闭的访问过程。
会话管理:是实现多个WEB页面(超链接)的数据共享。典型应用:购买页面的数据和支付页面的数据共享。
为什么不用request和servletContext实现呢?
不同的页面是不同的请求,不同的request
servletContext面多多个用户有并发问题
解决数据共享有2个方案:Cookie和session
Cookie是客户端技术,服务器将用户的数据发送给浏览器,写到IE缓存中。再次访问时则会带着COOKIE 数据去访问。
Session:是服务器技术,服务器为每一个用户创建一个独享的Session对象(默认情况下),将用户数据存在Session 中,存放在服务器上,下次访问时,服务器会把Session 数据打给浏览器
Cookie:
构造函数:Cookie(String name,String value);
addCookie(Cookie cookie);发送Cookie
getCookies();获取Cookie,所有的
setMaxAge(),getMaxAge()设置和获取有效期,单位是秒(默认是浏览器关闭则清除Cookie),setMaxAge(0)是删除Cookie
setValue(),getValue() 封装和获取cookie 中的数据
setPath(),getPath()设置和获取有效路径(这个cookie 在访问服务器的什么路径时会带Cookie)
setDomain(),getDomain(访问什么域名时带cookie去如.sina.com.cn)域名和WEB资源要对应,否则被认为第三方COOKIE会被浏览器阻止
浏览器第一次访问时, cookie为空,小心空指针
Cookie应用:显示上次访问时间
假设已经存有一个名字为lastAccessTime的Cookie
//获取上次的访问时间
Cookie[] cookies=request.getCookies();
For(int i=0;cookies!=null&&i<cookies.length;i++){
Cookie cookie=cookies[i];
If(cookie.getName().equals("lastAccessTime")){
Long time=Long.parseLong(cookie.getValue());
Date d=new Date(time);
response.getWriter().write(d.toLocalString());
}
}
//记录这次的访问时间
Cookie cookie=
new Cookie("lastAccessTime",System.CurrentTimeMilles()+"")
cookie.setMaxAge(3600);
response.addCookie(cookie);
Cookie细节:
一个Cookie只能表示一种信息,是一个键值对。Nam,value
一个浏览器一般允许存放300个Cookie,每个WEB站点,最多存放20个Cookie,每个Cookie 最大为4KB
setMaxAge(0)删除Cookie,新建的cookie 名字和Path 要相同。
setPath("/day07") 是通知浏览器带COOKIE /代表网站
Cookie应用:显示上次浏览过的商品
修改原有的 COOKIE ,把最新的 cookie带给服务器
首页 servlet:显示所有商品,浏览记录
另一个servlet:根据ID显示商品的详细信息,发送Cookie
数据类:需要检索用map,key是ID,,不需要用list
构建Cookie值要注意顺序和ID个数。比较复杂。
Session:
Session由服务器创建。第一次调用request.getSession()时创建 Session.只创建一个,session的销毁由服务器控制。默认30分钟
设置session有效时间:
通过 web.XML配置,单位分钟
<session-config>
<session-timeout>5</session-timeout>
</session-config>
编程方式:
Session.invalidate();让访问者的session失效
Session案例:简单的购物功能
原理:服务器是怎样实现一个session为一个用户浏览器服务的?
getSession()会穿件一个带ID的session.服务器会把session的id以cookie的形式写给浏览器。下次访问时getSession()会带着ID去找相应的session
为保证浏览器关闭,cookie依然存在,需要重新设置有效期
Cookie cookie=new Cookie("JESSIONID",session.getId);
cookie.setMaxAge(30*60);
cookie.setPath("/day07");
response.addCookie(cookie);
如果用户禁用了cookie:
再次访问时,getSession()会创建全新的session。无法获取原来的数据
解决办法:URL地址重写 ,创建session时返回的ID,会带在地址后面
encodeUrl()重写URL地址 (重写方法,第一次不管是否支持COOKIE都重写,后面如果发现浏览器支持COOKIE就不会重写。)
encodeRedirectUrl()重写重定向地址
如:买书跳转到支付页面,购买页面的sessionid会带在跳转地址后面,从而将买的书带到支付页面。
要多有的地址都重写,否则,每次只能买到一本。还要getSession()获取ID,然后重写
String url="/day06/RedirectServlet"
Url=response.encodeRedirectURL(url);
response.sendRedirect("url");
浏览器关闭,记录就消失。
Session案例:用户登录
原理:如果用户密码和数据库匹配,则在session中存一个已登录标记。同一次会话中,访问不在用登陆。
Session案例:防止表单重复提交
2种方式:
前台:javaScript
服务器:表单不直接交给浏览器,而是由一个servlet生成并交给浏览器, servet生成表单表单给用户的时候会附加一个随机数,然后把表单给用户,同时把随机数存到session中,用户提交时只有表单随机数和session中随机数一致才能提交,提交之后,这个随机数就从session中移除,重复提交,则带的是用过的随机数(没有重新生成表单,随机数也不会重新生成),session中没有对应的随机数,不能通过。
(就是hiden隐藏域添加一个令牌随机数)
随机数要由一个单独的对象生成(单例)。多个对象的话,随机数会重复
数据不管多大,数据指纹一样大,128位,不同的数据,不同的数据指纹
Md5算法:产生消息摘要,不可逆(特殊情况:2个数据的md5碰巧一样,可以得到原始数据)md5 编码后,会变成一个128为的数字
Md5 应用:密码加密与服务器的密码md5 码对比,网银客户端自动md5码对比防病毒,光盘数据检验生成MD5 码检验数据完好性
Base64算法:把3字节变4字节,防止乱码
原理:24位3个变24位4个,每个字节6个有效位,最高位补2个0,则最大数63,最小数0,所以称base64,对应64个键盘字符ABCD.....=
经过base64编码,会变成字母和符号组成的字符串。不会乱码
换行:浏览器用是br,其他用是\r\n
Session案例:注册验证码服务器验证
将验证码生成图片时的字符存到session中,用户提交时验证码和session中字符对比,一致则接受。
补充:day07感想:
注册,登陆,直接request.getSession().setAttribute("user",user);会自动校验是否已登陆。
防止表单重复提交:
直接用验证码
用一个servlet调用工具类方法得到验证码图片和字符,将字符存入session,将图片写出。表单上img标签引用这个servlet获得输出的图片。
提交时,比较2个的字符是否一致。
相关文章推荐
- 用Session来完成用户登录,防止表单重复提交。
- 用Session来完成用户登录,防止表单重复提交。
- 使用cookie,session,filter等技术实现用户自动登录
- Session-Servlet 防止表单重复提交 登录系统 代码
- JavaWeb -- Session实例 -- 自动登录 和 防止表单重复提交(令牌产生器) MD5码
- JavaWeb -- Session实例 -- 自动登录 和 防止表单重复提交(令牌产生器) MD5码
- Session学习:防止用户重复提交表单(单态设计模式-原子设计模式+MD5技术&Base64算法)
- 服务端如何识别已登录用户身份之Session管理和Cookie应用
- python带cookie提交表单自动登录(转)
- Servlet第五篇【介绍会话技术、Cookie的API、详解、应用】
- servlet会话技术Cookie,Session
- Servlet第五篇【介绍会话技术、Cookie的API、详解、应用】
- [原创]java WEB学习笔记34:Session 案例 之 解决表单重复提交
- Session应用之---防止表单重复提交
- 会话管理之Cookie技术+Session技术
- 会话技术 cookie和session 学习笔记
- Servlet学习笔记---防止表单重复提交
- JAVA通过Session和Cookie实现网站自动登录的技术
- 会话技术 cookie和session 学习笔记
- java web Servlet 学习笔记 -3 会话管理技术