day09-cookie&sessionのPPT学习

来源:互联网 发布:c语言自定义头文件 编辑:程序博客网 时间:2024/04/30 09:30

1:会话的定义

用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话

2:保存会话数据的两种技术

1-Cookie

Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

2-HttpSession

Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的HttpSession对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
##3:Cookie API##
javax.servlet.http.Cookie类用户创建一个Cookie,response接口中定义了一个addCookie方法,它用户在其响应头中增加一个相应的Set-Cookie头字段,同样,request接口中也定义了一个getCookies方法,它用户获取客户端提交的Cookie,Cookie类的方法:
1. public Cookie(String name,String value);
2. setValue(String value)与geValue()方法
3. setMaxAge(int expiry)与getMaxAge()方法(秒)
4. setPath(String uri)与getPaht()方法
5. setDomain(String pattern)与getDomain()方法
6. getName()方法

4:Cookie应用

1:显示用户上次访问时间

protected void doGet(HttpServletRequest request,HttpServletResponse response) throws Exception{    //设置编码    response.setContentType("text/html;charset=UTF-8");    //获得字符输出流对象    PrintWriter out = response.getWriter();    out.println("你上次登录的时间为:");    //取出最后一次的登录时间,CookieName为lastAccessTime    Cookie[] cookies = request.getCookies();    for(int i=0;cookies != null && i<cookies.length;i++){        if(cookies[i].getName().equals("lastAccessTime")){            long time = Long.parseLong(cookies[i].getValue());            Date date = new Date(time);            out.println(date.toLocaleString());        }    }    //将本次的访问时间记录下来    Cookie cookie = new Cookie("lastAccessTime",System.currentTimeMillis()+"");    //设置有效期    cookie.setMaxAge(30*24*3600);//单位为秒,这里共30天    cookie.setPath("/JavaWeb");//设置路径    response.addCookie(cookie);}

5:Cookie细节

  1. 一个Cookie只能表示一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE);
  2. 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB;
  3. 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
  4. 注意,删除cookie时,path必须一致,否则不会删除

6:HttpSession

  1. 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
  2. Session和Cookie的主要区别在于:
    Cookie是把用户的数据写给用户的浏览器。
    Session技术把用户的数据写到用户独占的session中。
  3. Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
  4. Session小实验:使用IE访问某一个servlet,其它IE可以取到这个servlet存的数据吗?

7:session案例

使用Session完成简单的购物功能

  1. 使用Session完成用户登陆
  2. 利用Session防止表单重复提交
  3. 利用Session实现一次性验证码
  4. 利用Session实现购物车

    防止表单重复提交


    var isCommited = false;
    function checkPost(){
    if(!isCommited){
    //document.getElementById("sub").disabled = true;
    isCommited = true;
    return true;
    }else{
    alert("不能重复提交");
    return false;
    }
    }


不足:但用户单击”刷新”,或单击”后退”再次提交表单,将导致表单重复提交
new BigInteger(165, new Random()).toString(36).toUpperCase();
MessageDigest.getInstance(“md5”); BASE64Encoder

表单页面由servlet程序生成,servlet为每次产生的表单页面分配一个唯一的随机标识号,并在FORM表单的一个隐藏字段中设置这个标识号,同时在当前用户的Session域中保存这个标识号。
当用户提交FORM表单时,负责处理表单提交的serlvet得到表单提交的标识号,并与session中存储的标识号比较,如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。
在下列情况下,服务器程序将拒绝用户提交的表单请求:

  1. 存储Session域中的表单标识号与表单提交的标识号不同
  2. 当前用户的Session中不存在表单标识号
  3. 用户提交的表单数据中没有标识号字段

编写工具类生成表单标识号:TokenProcessor

session案例一次性校验码

  1. 一次性验证码的主要目的就是为了限制人们利用工具软件来暴力猜测密码。
  2. 服务器程序接收到表单数据后,首先判断用户是否填写了正确的验证码,只有该验证码与服务器端保存的验证码匹配时,服务器程序才开始正常的表单处理流程。
  3. 密码猜测工具要逐一尝试每个密码的前题条件是先输入正确的验证码,而验证码是一次性有效的,这样基本上就阻断了密码猜测工具的自动地处理过程。
    IE禁用Cookie后的session处理
    实验演示禁用Cookie后servlet共享数据导致的问题。

解决方案:URL重写

  1. response. encodeRedirectURL(java.lang.String url)
    用于对sendRedirect方法后的url地址进行重写。
  2. response. encodeURL(java.lang.String url)
    用于对表单action和超链接的url地址进行重写

附加:

Session的失效 invalidate()立刻实效
Web.xml文件配置session失效时间
状态

综合案例

应用Session+Cookie技术完成用户自动登陆功能

0 0
原创粉丝点击