Cookie&Session

Posted 亿钱君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cookie&Session相关的知识,希望对你有一定的参考价值。

Cookie&Session

1、Cookie 饼干

1.1 什么是 Cookie?

1.2 Cookie API

  • public String getName():返回cookie名称,名称一旦创建就不能改变
  • public String getValue():返回cookie值
  • public void setValue();为cookie指定一个新值
  • public void setMaxAge():设置cookie在浏览器中的最长存活时间
  • public int getMaxAge():返回cookie最长存活时间

cookie管理包含两个方面:将cookie对象发送到客户端对象和从客户端读取cookie

1.3 向客户端发送Cookie

  • 1、创建Cookie对象
  • 2、设置最大存活时间
  • 3、向客户发送Cookie对象

1.2 如何创建 Cookie

BaseServlet

package com.atguigu.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

public abstract class BaseServlet extends HttpServlet 

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

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        // 解决post请求中文乱码问题
        // 一定要在获取请求参数之前调用才有效
        req.setCharacterEncoding("UTF-8");

        String action = req.getParameter("action");
        try 
            // 获取action业务鉴别字符串,获取相应的业务 方法反射对象
            Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
//            System.out.println(method);
            // 调用目标业务 方法
            method.invoke(this, req, resp);
         catch (Exception e) 
            e.printStackTrace();
        
    



CookieServlet

import java.io.IOException;

/**
 * @author syl
 * @create 2021/6/1-16:51
 */
public class CookieServlet extends BaseServlet


    protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 

        //创建cookie对象
        Cookie cookie = new Cookie("key","value1");
        //通知客户端保存cookie
        resp.addCookie(cookie);
        resp.getWriter().write("Cookie创建成功");
    


问题1:解决乱码问题:


问题2:创建cookie机制

注意:同时可以创建多个cookie

1.3 服务器如何获取 Cookie

1、服务器获取客户端的 Cookie 只需要一行代码:Cookie[] cookies = req.getCookies();

2、遍历数组对象

package com.atguigu.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author syl
 * @create 2021/6/1-16:51
 */
public class CookieServlet extends BaseServlet

    protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        //服务器获取 Cookie
        Cookie[] cookies = req.getCookies();

        //遍历打印一下
        for(Cookie cookie:cookies)
            resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "]<br/>");
        
    


    protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 

        //创建cookie对象
        Cookie cookie = new Cookie("key","value1");
        //通知客户端保存cookie
        resp.addCookie(cookie);
        resp.getWriter().write("Cookie创建成功");
    



问题:有时候不想获取全部cookie,只想获取到某个cookie怎么办?

  • 解决方式:只能在遍历时增加判断条件



注意:由于遍历查找cookie的操作,很常用,故一般都是写个工具类,把该操作提取出来

1.4 Cookie 值的修改

方案一:


方案二:

1.5 浏览器查看 Cookie

F12–>

1.6 Cookie 生命控制

Cookie 的生命控制指的是如何管理 Cookie 什么时候被销毁(删除)

举例:


1.7 Cookie 有效路径 Path 的设置

有效实现过滤的效果

package com.atguigu.servlet;

import com.atguigu.util.CookieUtils;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author syl
 * @create 2021/6/1-16:51
 */
public class CookieServlet extends BaseServlet

    protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        //服务器获取 Cookie
        Cookie[] cookies = req.getCookies();


        Cookie iWantCookie = CookieUtils.findCookie("key",cookies);

        if(iWantCookie!=null)
            resp.getWriter().write("找到了需要的cookie");
        
    

    protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        Cookie cookie = new Cookie("path1", "path1");

        // getContextPath() ===>>>> 得到工程路径
        cookie.setPath( req.getContextPath() + "/abc" );
        // ===>>>> /工程路径/abc
        resp.addCookie(cookie);
        resp.getWriter().write("创建了一个带有 Path 路径的 Cookie");
    






出于安全考虑,被过滤,必须要满足在/abc路径下才可看!!!!!

1.8 Cookie 练习—免输入用户名登录

  • 思路:

LoginServlet类

package com.atguigu.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author syl
 * @create 2021/6/1-19:48
 */
public class LoginServlet extends HttpServlet 

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        if("syl795".equals(username)&&"123456".equals(password))
            //登陆成功
            Cookie cookie = new Cookie("username",username);
            cookie.setMaxAge(60*60*24*7);//当前cookie一周内有效
            resp.addCookie(cookie);
            System.out.println("登陆成功");
        else
            //登陆失败
            System.out.println("登陆失败");
        
    



2、Session 会话

2.1 什么是 Session 会话?

  • 会话是客户与服务器之间的不间断的请求响应序列
  • 当一个客户向服务器发送第一个请求时就开始了一个会话。
  • 对该客户的之后的每个请求,服务器能够识别出请求来自同一个客户。
  • 当客户明确结束会话或服务器在一个预定义的时限内没从客户接收任何请求时,会话就结束了。
  • 当会话结束后,服务器就忘记了客户以及客户的请求

2.2 会话管理机制

  • 1、客户向服务器发送第一个请求,服务器为该客户创建一个HttpSession会话对象(同时为其指定会话ID,可作为该客户的唯一标识),并将请求对象与该会话对象关联。此时会话处于新建状态,可以使用isNew()来确定会话是否属于该状态。
  • 2、当服务器向客户发送响应时,服务器会将该会话ID与响应数据一起发给客户(通过Set-Cookie响应头来实现)
  • 3、客户在接收到响应时会将会话ID存储在浏览器内存中,当客户再次向服务器发送请求时,它使用cookie请求头把会话ID与请求一起发送给服务器
  • 4、服务器接收到请求后,从请求对象中取出会话ID,在服务器中查找之前创建的会话对象,找到后将该请求对象与之前创建的ID值相同的会话对象关联起来

注意:不能使用客户的IP地址唯一标识客户

2.3 HttpSession API

  • getId():返回该会话指定的唯一标识符,是一个32位的16进制数
  • isNew():新创建的会话对象,还未和客户关联,则返回true
  • public void setAttribute(String name,Object value):将一个指定名称和值的属性存储在会话对象上
  • public Object getAttribute(String name):返回存储到会话上的指定名称的属性值,如果没有则返回null
  • public void removeAttribute(String name):从会话中删除指定名称的属性值
  • public void invalidate():使会话对象失效并删除存储在其上的任何对象

2.4 使用HttpSession对象

三步骤:

  • 创建会话对象( HttpSession session = request.getSession();)
  • 在会话对象中添加或删除“名/值”属性
  • 如果需要可使会话失效
package com.atguigu.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @author syl
 * @create 2021/6/1-20:44
 */
public class SessionServlet extends HttpServlet 



    protected void createOrGetSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 

        //创建和获取session会话对象
        HttpSession session = request.getSession();
        
        //判断当前session会话,是否是新创建出来的id
        boolean isNew = session.isNew();

        //获取session会话的唯一标识id
        String id = session.getId();

        response.getWriter().write("得到的session,它的ID是:" + id + "<br/>");
        response.getWriter().write("这个session是否是新创建的:" + isNew + "<br/>");
    




2.5 Session 域数据的存取

2.6 Session 生命周期控制




Session 超时的概念介绍:

2.7 浏览器和 Session 之间关联的技术内幕

以上是关于Cookie&Session的主要内容,如果未能解决你的问题,请参考以下文章

Cookie&Session

Cookie&Session

Cookie&Session

cookie&session

cookie & session

cookie & session