您的位置:首页 > 其它

笔记之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个的字符是否一致。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: