Session和Cookie实践

前言

Session和Cookie这是做Web开发的避免不了的一个问题,怎么说呢,不用的时候很久也不会用,用的时候可能也很频繁,系统中还是有很多地方需要使用Session和Cookie,它们说简单也简单,说难也真的比较难,说简单呢,是因为它只是Http协议的一个配置,说困难呢,是因为多台服务器之间Session共享,不同浏览器对于Cookie大小的限制不一样。
今天和同事讨论一个关于登陆的问题,现在项目使用的是聚合项目,数据和视图分开了,项目分为API和UI,API提供数据,UI是前端页面,这样就会导致一些问题,就比如两个项目是不同的上下文,就是不同的会话,Session共享比较麻烦,就在想该怎么解决,也就有了这篇文章。

目录

  • 理解Cookie
  • 理解Session
  • Session和Cookie应用

一、理解Cookie

  • Cookie是Http协议的一部分
  • Cookie是由键和值构成的
  • Cookie是存储在浏览器中的
  • Cookie分为会话Cookie和本地Cookie
  • Cookie是由服务器创建的,然后通过response响应发送给客户端的一个键值对
  • Cookie大小上限是4kb
  • Cookie在浏览器端存储的个数是有限的

Cookie通俗的说就是当一个用户通过HTTP协议访问一个服务器的时候,这个服务器会将一些Key/value键值对返回给客户端浏览器,并给这些数据加上一些限制条件,在条件符合时这个用户下次访问这个服务器的时候,数据又被完整地带回服务器。

Cookie设计初衷

  • Cookie是由W3C设计的
  • Http是无状态协议
  • 用于记录用户在一段时间内访问Web应用的行为路径

Cookie属性

Session和Cookie实践_第1张图片
Paste_Image.png

二、理解Session

Cookie可以让服务器端程序跟踪每个客户端的访问,但是每次客户端的访问都必须传回这些Cookie,如果Cookie很多,就会增加客户端和服务器端的传输量,Session就是解决这个问题的。

  • Session存储在服务器端
  • Session是依赖于Cookie的

三、Cookie的应用

@RequestMapping("/aservlet")
    public void AServlet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html;charset=utf-8");

        String id = UUID.randomUUID().toString();
        Cookie cookie = new Cookie("id", id);
        response.addCookie(cookie);
        response.getWriter().print("已经给你发送了ID");
    }

    @RequestMapping("/bservlet")
    public void BServlet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html;charset=utf-8");

        Cookie []  cs = request.getCookies();
        if(cs != null){
            for (Cookie c : cs) {
                if(c.getName().equals("id")){
                    response.getWriter().print("您的ID是:"+c.getValue());
                }
            }
        }
    }
  • 有两个Servlet,AServlet创建一个cookie,cookie的键是id,值也是id,然后通过response响应给客户端,并且显示在页面
  • BServlet通过request请求得到Cookie,因为还会产生其他的Cookie,所以要使用数组接收,然后显示在页面上。
Session和Cookie实践_第2张图片
Paste_Image.png
  • BServlet
Session和Cookie实践_第3张图片
Paste_Image.png

Session原理

Session和Cookie实践_第4张图片
Paste_Image.png
  • 客户端创建session,保存到服务器端
  • 服务器通过cookie把SessionID发送给客户端
  • 下一次客户端只要带上SessionID访问服务器,就可以得到Session

就比如我首次去银行时,因为还没有账号,所以需要开一个账号,我获得的是银行卡,而银行这边的数据库中留下了我的账号,我的钱是保存在银行的账号中,而我带走的是我的卡号。
当我再次去银行时,只需要带上我的卡,而无需再次开一个账号了。只要带上我的卡,那么我在银行操作的一定是我的账号!

Session应用(登陆案例)

需求

  • 提供3个页面,login.jsp,index1.jsp,index2.jsp
  • login.jsp提供登陆,index1.jsp和index2.jsp用户显示当前的用户名称,如果用户还没有登陆,就显示没有登录。

index1.jsp和index2.jsp页面是一样的,代码如下:


  
    index1.jsp
  
  
  

index1.jsp

<% String username = (String)session.getAttribute("username"); if(username == null) { out.print("您还没有登录!"); } else { out.print("用户名:" + username); } %>
index2

LoginServlet代码:

public class LoginServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        
        String username = request.getParameter("username");
        
        if(username.equalsIgnoreCase("cheng")) {
            response.getWriter().print("用户名或密码错误!");
        } else {
            HttpSession session = request.getSession();
            session.setAttribute("username", username);
            response.sendRedirect("/index1.jsp");
        }
    }
}

当用户没有登录时访问index1.jsp或index2.jsp,显示“您还没有登录”。如果用户在login.jsp登录成功后到达index1.jsp页面会显示当前用户名,而且不用再次登录去访问index2.jsp也会显示用户名。因为多次请求在一个会话范围,index1.jsp和index2.jsp都会到session中获取用户名,session对象在一个会话中是相同的,所以都可以获取到用户名!

你可能感兴趣的:(Session和Cookie实践)