Cookie和Session知识点整理

Cookie(客户端)

什么是Cookie

  • Cookie 是服务器通知客户端保存键值对的一种技术
  • 客户端有了Cookie 后,每次请求都发送给服务器
  • 每个Cookie的大小不能超过4kb

如何创建Cookie

在这里插入图片描述

可以一次性创建多个Cookie

创建Servlet程序

public abstract class BaseServlet extends HttpServlet {
     
     

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

        response.setContentType("text/html;charset=UTF-8");

        //获取隐藏表单项的action的值
        String action = request.getParameter("action");

        //利用反射获取相应的用户行为,避免使用大量的if else
        //我们只需要在下面编写相应的方法即可,修改密码,绑定邮箱,绑定手机号等业务
        try {
     
     
            //获取action鉴别对象,获取相应的业务
            Method method = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
            //调用目标业务
            method.invoke(this,request,response );

        } catch (Exception e) {
     
     
            e.printStackTrace();
        }
    }

    //因为图书管理板块的提交方式是Get请求,所以我们让doGet执行doPost相同的操作
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
        doPost(request,response);
    }
}

CookieServlet程序

public class CookieServlet extends BaseServlet {
     
     


    protected void createCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
        //1.创建Cookie对象
        Cookie cookie = new Cookie("key1","value1");
        //2.通知客户端保存Cookie(服务器发送给客户端/浏览器,所以是response)
        response.addCookie(cookie);

        response.getWriter().write("Cookie创建成功");
        //解决中文乱码问题在BaseServlet中,        response.setContentType("text/html;charset=UTF-8");

    }
}

web.xml

    <servlet>
        <servlet-name>CookieServlet</servlet-name>
        <servlet-class>com.gw.servlet.CookieServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CookieServlet</servlet-name>
        <url-pattern>/cookieServlet</url-pattern>
    </servlet-mapping>

cookie.html

	<base href="http://localhost:8080/13_cookie_session/">

			<li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li>

服务器如何获取Cookie

    protected void getCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
                //遍历所有的Cookie
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie: cookies){
     
     
            response.getWriter().write("Cookie["+cookie.getName()+"="+cookie.getValue()+"]"+"<br/>");
        }

        //查找特定的Cookie
        Cookie iWantCookie = CookieUtils.findCookie("key1",cookies);
    }
}

查找特定的cookie

//查找指定名称的cookie对象
public class CookieUtils {
     
     
    public static Cookie findCookie(String name,Cookie[] cookies){
     
     
        if (name==null|| cookies==null|| cookies.length==0){
     
     
            return null;
        }
        for (Cookie cookie : cookies) {
     
     
            if (name.equals(cookie.getName())){
     
     
                return cookie;
            }
        }
        return null;
    }
}

Cookie值的修改

    protected void updateCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        /*方案一*/
        //覆盖之前的
        Cookie cookie = new Cookie("key1","value111");
        response.addCookie(cookie);

        /*方案二*/
        //1 先找到需要修改的Cookie对象
        Cookie cookie1 = CookieUtils.findCookie("key1",request.getCookies());
        //2 调用setValue()方法赋予新值
        cookie1.setValue("value111");
        //3 调用response.addCookie()
        response.addCookie(cookie1);
    }

Cookie在浏览器中查看

Application中查看Cookie

Cookie的生命控制

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

setMaxAge()

  • 正数:指定秒数之后过期
  • 负数:关闭浏览器之后销毁(默认-1)
  • 0 :立刻销毁Cookie
   
protected void defaultCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        Cookie cookie = new Cookie("default1","value1");
        //-1是默认值
        cookie.setMaxAge(-1);
        response.addCookie(cookie);
    }

    protected void deleteCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        Cookie cookie = CookieUtils.findCookie("default1",request.getCookies());
        if (cookie!=null){
    
    
            //表示立即删除
            cookie.setMaxAge(0);
            response.addCookie(cookie);
        }
    }

    protected void life1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        Cookie cookie = new Cookie("default1","value1");
        //存活一个小时(就算关闭浏览器也能存活)
        cookie.setMaxAge(60*60);
        response.addCookie(cookie);
    }

Cookie有效路径Path设置

Cookie的Path属性可以有效过滤哪些Cookie可以发送给服务器,哪些不发;进行有效过滤

理解

CookieA--------path=/工程路径

CookieB--------path=/工程路径/abc


请求地址判断:

  • http://ip:port/工程路径/a.html
    • CookieA 发送
    • CookieB不发送
  • http://ip:port/工程路径/abc/a.html
    • CookieA 发送(后面路径 的不用看)
    • CookieB 发送
   //path属性
   protected void testPath(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
       Cookie cookie = new Cookie("path1","path1");
       //获取工程路径request.getContextPath()
       cookie.setPath(request.getContextPath()+"/abc");// 工程路径/abc
       response.addCookie(cookie);
   }

免用户名登录

在这里插入图片描述

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="http://localhost:8080/13_cookie_session/loginServlet" method="get">
        用户名:<input type="text" name="username" value="${cookie.username.value}"><br>
        密码:<input type="password" name="password"><br>
        <input type="submit" value="登录">
    </form>
</body>
</html>

LoginServlet

public class LoginServlet extends HttpServlet {
     
     
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        if ("gao123".equals(username) && "123456".equals(password)){
     
     
            //创建一个Cookie对象
            Cookie cookie = new Cookie("username",username);
            cookie.setMaxAge(60*60*24*7);//Cookie保存一周时间(也就是用户名保存一周时间)
            response.addCookie(cookie);

            System.out.println("登陆成功");

        }else{
     
     
            System.out.println("登陆失败");
        }

    }

web.xml

    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.gw.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/loginServlet</url-pattern>
    </servlet-mapping>

Session(服务器端)

什么是Session

  • Session就是一个接口(HttpSession
  • Session会话,就是用来维护一个客户端和服务器之间关联的一种技术
  • 每个客户都有自己的一个Session会话
  • Session会话中,我们经常用来保护用户登录之后的信息

如何创建Session和获取

request.getSession()

  • 第一次调用是:创建Session会话
  • 之后调用都是: 获取之前创建的Session会话对象

isNew() :判断是不是刚创建出来的

  • true: 表示刚创建的
  • false: 表示获取之前的会话对象

每个会话都有一个身份证号,也就是ID值,唯一的;getId()得到Session会话的id值

SessionServlet

创建和获取

public class SessionServlet extends BaseServlet {
     
     

    protected void createOrGetSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
        //创建和获取Session对象
        HttpSession session = request.getSession();
        //判断当前的Session会话是否是新创建的
        boolean isNew = session.isNew();
        //获取唯一标识ID
        String id = session.getId();

        response.getWriter().write("唯一标识ID"+id);
        response.getWriter().write("是否是新创建的"+isNew);
    }
}

web.xml

    <servlet>
        <servlet-name>SessionServlet</servlet-name>
        <servlet-class>com.gw.servlet.SessionServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionServlet</servlet-name>
        <url-pattern>/sessionServlet</url-pattern>
    </servlet-mapping>
			<li><a href="sessionServlet?action=createOrGetSession" target="target">Session的创建和获取(id号、是否为新创建)</a></li>

Session域中的数据

    //存储
    protected void setAttribute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
        request.getSession().setAttribute("key1", "value1");
        response.getWriter().write("往Session域中已经存储了数据");
    }

    //获取
    protected void getAttribute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
        Object key1 = request.getSession().getAttribute("key1");
        response.getWriter().write("Session中获取的值"+key1);
    }
		<li><a href="sessionServlet?action=setAttribute" target="target">Session域数据的存储</a></li>
			<li><a href="sessionServlet?action=getAttribute" target="target">Session域数据的获取</a></li>

Session生命周期

Session超时 指的是客户端两次请求的最大间隔时长

  • Session的默认超时时间为30分钟

    在Tomcat服务器的配置文件web.xml中默认有如下的配置,表示配置了Tomcat的所有Session超时时长为30分钟

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
    
  • 如果在某个web工程下修改了web.xml文件的上述配置信息的超时时间,则整个web下的session都是修改后的值

  • 如果只需要修改特定的Session的超时时间,则需要如下方法

默认时长
    //获取Session的默认超时时长
    protected void defaultLife(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        int maxInactiveInterval = request.getSession().getMaxInactiveInterval();
        response.getWriter().write("默认超时时间为"+maxInactiveInterval);
    }
修改超时时长
    //修改3秒超时时长
    protected void life3(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        HttpSession session = request.getSession();
        session.setMaxInactiveInterval(3);
        response.getWriter().write("当前Session设置为3秒后超时");
    }
立即销毁
    //让Session马上超时
    protected void deleteNow(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        HttpSession session = request.getSession();
        //马上销毁
        session.invalidate();
        response.getWriter().write("当前Session设置立即销毁");
    }

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

er().write(“当前Session设置为3秒后超时”);
}


##### **立即销毁**

```java
    //让Session马上超时
    protected void deleteNow(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        //马上销毁
        session.invalidate();
        response.getWriter().write("当前Session设置立即销毁");
    }

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

在这里插入图片描述
声明:学自尚硅谷的视频整理而成

猜你喜欢

转载自blog.csdn.net/weixin_46250447/article/details/112298545