会话技术介绍-cookie

##会话技术介绍 ###什么是会话技术 会话能够简单理解为:用户开一个浏览器,点击多个超连接,访问服务器多个web资源而后关闭浏览器,整个过程称之为一个会话。 ###会话过程要解决的一些问题 每一个用户与服务器进行交互的过程当中,各自会有一些数据,程序要想办法保存每一个用户的数据, 例如:用户点击点击超连接经过一个servlet购买一个商品,程序应该保存用户购买的产品,以便于用户点结帐时,结帐servlet能够获得用户商品为用户结帐。 question:用户购买的商品保存在request或servletContext行不行 answer:不行 ##保存会话数据的两种技术 cookie是客户端技术, 程序把每一个用户的数据,以cookie的形式写给用户各自的浏览器,当浏览器再去访问服务器中的web资源时,就会带着各自的数据去,这样,web资源处理的就是用户各自的数据了。html

session是服务端技术
利用这个技术,服务器在运行时能够为每个用户的浏览器建立一个其独享的session对象,因为session是用户浏览器对象,因此用户在访问服务器的web资源时,能够把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它资源再从用户各自的session中取出数据为用户服务。

##cookie案例 ###cookie api javax.servlet.http.cookie类用户建立一个cookie,response接口中也定义了一个addCookie方法,它用于在其响应头中增长一个相应的set-cookie头字段。一样,request接口中也定义了一个getCookies方法,它用于获取客户提交的cookie。 cookie类的方法:java

  1. public Cookie(String name,String value)
  2. setValue , getValue
  3. setMaxAge , getMaxAge
  4. setPath, getPath
  5. setDomain,getDomain
  6. getName

生成cookie的代码web

Cookie cookie = new Cookie("lastAccessTime",System.currentTimeMillis());
cookie.setMaxAge(10);
cookie.setPath("/day07");
response.addCookie(cookie);

删除cookie cookie.setMaxAge(0); 用js也能够删除Cookie ##显示用户上次访问的时间api

response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter pw = response.getWriter();
        pw.print("你上次的访问时间是:");
        Cookie cookies[] = request.getCookies();
        for (int i = 0; cookies != null && i < cookies.length; i++) {
            if (cookies[i].getName().equals("lastAccessTime")) {
                long cookieValue = Long.parseLong(cookies[i].getValue());
                Date date = new Date(cookieValue);
                pw.print(date.toLocaleString());
            }
        }

        Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis() + "");
        cookie.setMaxAge(120);
        cookie.setPath(request.getContextPath());
        response.addCookie(cookie);

##cookie的细节浏览器

*. 一个cookie职能标识一种信息,它至少含有一个标识该信息的名称(name)和值(value)服务器

*. 一个web站点能够给一个web浏览器发送多个Cookie,一个WEB浏览器也能够存储多个web站点提供的cookie。cookie

*. 浏览器通常只容许存放300个cookie,每一个站点最多存放20个cookie,每一个cookie的大小限制为4KB。session

*. 若是建立一个cookie,并将他发送到浏览器,默认状况下它是一个会话级别的cookie(存储在浏览器的内存中),用户推出浏览器以后即被删除。若但愿浏览器将该cookie存储在磁盘上,则须要使用setMaxAge,并给出一个以秒为单位的时间。将最大实效设为0则是命令浏览器删除该cookie。app

*. 删除cookie时,path必须一致,不然不会删除。网站

##cookie案例:显示用户浏览历史纪录

需求说明

public class ViewallServlet extends HttpServlet {
 response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.write("本网站有以下商品: </br>");
        Map<Integer, Book> map = Db.getAll();
        Set<Entry<Integer, Book>> entrySet = map.entrySet();
        for (Entry<Integer, Book> entry : entrySet) {
            Book book = entry.getValue();
            out.print("<a href=/test-web/BuybookServlet?id=" + entry.getKey() + ">" + book.getName() + "</a><br/>");
        }
        
        // 显示用户曾经看过的商品
        Cookie[] cookies = request.getCookies();
        for (int i = 0; cookies != null && i < cookies.length; i++) {
            Cookie cookie = cookies[i];
            if (cookie.getName().equals("bookHistory")) {
                String value = cookie.getValue();
                if (value == null) {
                    return;
                }
                System.out.println(value);
                String[] ids = value.split(",");
                for (String id : ids) {
                    out.print("浏览过的商品</br>");
                    out.print(Db.getAll().get(Integer.valueOf(id)).getName() + "</br>");
                }
            }
        }
}
public class BuybookServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String id = request.getParameter("id");
        Book book = Db.getAll().get(Integer.valueOf(id));
        PrintWriter pw = response.getWriter();
        pw.print(book.getId() + "</br>" + book.getName());
        // 构建cookie,回写浏览器
        String cookieValue = buildCookie(id, request);
        Cookie cookie = new Cookie("bookHistory", cookieValue);
        cookie.setMaxAge(600);
        cookie.setPath(request.getContextPath());
        response.addCookie(cookie);
    }

    private String buildCookie(String id, HttpServletRequest request) {
        String bookHistory = null;
        Cookie cookies[] = request.getCookies();
        if (cookies == null) {
            return id;
        }
        for (Cookie cook : cookies) {
            if (cook.getName().equals("bookHistory")) {
                bookHistory = cook.getValue();
                break;
            }
        }
        if (bookHistory == null) {
            return id;
        }
        LinkedList<String> list = new LinkedList<String>();
        String[] splits = bookHistory.split("\\,");
        for (String split : splits) {
            list.addFirst(split);
        }

        if (list.isEmpty()) {
            return id;
        }

        if (list.contains(id)) {
            list.remove(id);
            list.addFirst(id);
        } else {
            if (list.size() > 3) {
                list.removeLast();
                list.addFirst(id);
            } else {
                list.addFirst(id);
            }
        }
        StringBuffer buffer = new StringBuffer();
        for (String bid : list) {
            buffer.append(bid).append(",");
        }
        buffer.deleteCharAt(buffer.length()-1);
        return buffer.toString();
    }
}
相关文章
相关标签/搜索