1. 程式人生 > 其它 >java web-02-cookie和session

java web-02-cookie和session

1、儲存會話的兩種技術

cookie

  • 客戶端技術(響應,請求)

session

  • 伺服器技術,利用這個技術,可以儲存使用者的會話資訊?我們可以把資訊或者資料放在session中!

常見場景:網站登入之後,之後就不用登入直接進入;

2、Cookie

2.1、獲取cookie

public class Cookie01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        //伺服器從客戶端獲取cookie,客戶端可能不止一個
        Cookie[] cookies = req.getCookies();
        if (cookies != null) {
            writer.write("上一次時間是:");
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                if (cookie.getName().equals("lastLoginTime")){
                    long l = Long.parseLong(cookie.getValue());
                    Date date = new Date(l);
                    writer.write(date.toString());
                }
            }
        }else {
            writer.write("這是第一次登入本站");
        }

        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
        cookie.setMaxAge(24*60*60);
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }

新增對映

測試!

2.2、刪除cookie

public class Cookie02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
        cookie.setMaxAge(0);
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

新增對映

測試!

2.3、防止亂碼

public class Cookie03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        //伺服器從客戶端獲取cookie,客戶端可能不止一個
        Cookie[] cookies = req.getCookies();
        if (cookies != null) {
            writer.write("上一次訪問名是:");
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                if (cookie.getName().equals("username")) {
                    writer.write(URLEncoder.encode(cookie.getValue(),"utf-8"));
                }
            }
        }else {
            writer.write("這是第一次訪問本站");
        }

        Cookie cookie = new Cookie("username", URLEncoder.encode("張三","utf-8"));
        cookie.setMaxAge(60);
        resp.addCookie(cookie);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

新增對映

測試!

3、session

Session和Cookie的區別:

  • Cookie是把使用者的資料寫給使用者的瀏覽器,瀏覽器儲存(可以儲存多個)
  • Session把使用者的資料寫到使用者獨佔Session中,伺服器端儲存
  • Session物件由服務建立;
3.1、往session裡面存東西
public class Session01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        HttpSession session = req.getSession();
        session.setAttribute("name",new Person("zhangsan",20));
        String id = session.getId();
        if (session.isNew()) {
            resp.getWriter().write("session建立成功"+id);
        }else {
            resp.getWriter().write("session已經存在伺服器中:"+id);
        }

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

新增對映

測試!

3.2、從session中獲取我們存進去的資料
public class Session02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        HttpSession session = req.getSession();
        Person name = (Person) session.getAttribute("name");
        resp.getWriter().println(name);
        System.out.println(name);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

新增對映

測試!

3.3、登出session
public class Session03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        HttpSession session = req.getSession();
        session.removeAttribute("name");//移除屬性
        session.invalidate();//登出session

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

新增對映

測試!

3.4、設定session自動失效時間
<session-config>
    <!--以分鐘為單位-->
    <session-timeout>15</session-timeout>
</session-config>