-->

session与cookie

1. 说明

由于http协议是无状态的,所以服务器是不知道客户端是谁的,而当我们进行购物等操作是需要将购物车关联用户,不能导致我的商品到你的购物车的情况,这时就需要服务器记住客户端,此时就需要用到session与cookies

2. Cookies

什么是cookies

 Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。

  由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。

  Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容
image
查看某个网站颁发的Cookie很简单。在浏览器地址栏输入javascript:alert (document. cookie)就可以了(需要有网才能查看)。JavaScript脚本会弹出一个对话框显示本网站颁发的所有Cookie的内容,如下图所示。
image

代码通过cookies实现记住我

添加Cookies

import domain.User;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import model.UserModel;

import java.io.IOException;
import java.sql.SQLException;

@WebServlet(name = "loginServlet", value = "/login")
public class loginServlet extends HttpServlet {
    UserModel model = new UserModel();

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");
        String pwd = request.getParameter("pwd");
        String remember = request.getParameter("rememberme");
        try {
//            添加Session
            User user = model.selectByNameAndPwd(name, pwd);
            HttpSession session = request.getSession();
            session.setAttribute("user",user);
            if ("on".equals(remember)) {
//                如果勾选记住我,将用户名密码添加到Cookies
                response.addCookie(new Cookie("n", user.getName()));
                response.addCookie(new Cookie("p", user.getPwd()));
            }

            if (user == null){
                response.sendRedirect("/web/login.html");
            }else {
                request.getRequestDispatcher("/main.html").forward(request,response);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

    }
}

获取Cookies

import domain.User;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import model.UserModel;

import java.io.IOException;
import java.sql.SQLException;

@WebServlet(name = "SaveServlet", value = "/save")
public class SaveServlet extends HttpServlet {

    private UserModel model = new UserModel();
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("=====================");
        System.out.println(request.getSession().getAttribute("user"));

        Cookie[] cookies = request.getCookies();
        for(Cookie c: cookies){
            System.out.println(c.getName() + ":" + c.getValue());
        }

        User user = new User();
        String sid = request.getParameter("id");
        int id = -1;
        if (sid != null && !"".equals(sid.trim())){
            id = Integer.parseInt(sid);
        }
        user.setId(id);
        user.setName(request.getParameter("name"));
        user.setPwd(request.getParameter("pwd"));
        user.setAdmin(Integer.parseInt(request.getParameter("admin")));
        try {
            if (id == -1){
                model.insert(user);
            }else {
                model.update(user);
            }
            response.sendRedirect("user_list.jsp");
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

3. Session

什么是Session

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

  如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

代码

后端存储Session

import domain.User;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import model.UserModel;

import java.io.IOException;
import java.sql.SQLException;

@WebServlet(name = "loginServlet", value = "/login")
public class loginServlet extends HttpServlet {
    UserModel model = new UserModel();

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");
        String pwd = request.getParameter("pwd");
        String remember = request.getParameter("rememberme");
        try {
//            添加Session
            User user = model.selectByNameAndPwd(name, pwd);
            HttpSession session = request.getSession();
            session.setAttribute("user",user);
            if ("on".equals(remember)) {
//                如果勾选记住我,将用户名密码添加到Cookies
                response.addCookie(new Cookie("n", user.getName()));
                response.addCookie(new Cookie("p", user.getPwd()));
            }

            if (user == null){
                response.sendRedirect("/web/login.html");
            }else {
                request.getRequestDispatcher("/main.html").forward(request,response);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

    }
}

前端获取Session

<%--
  Created by IntelliJ IDEA.
  User:***
  Date: 2022/8/12
  Time: 14:51
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
===========
<%=session.getAttribute("user")%>
===========
<% Object [] os = (Object[]) request.getAttribute("u");%>
<form action="save" method="post">
<% if (os !=null){ %>

        ID: <input type="text" name="id" value="<%=os[0]%>"/> <br />
        用户名: <input type="text" name="name" value="<%=os[1]%>"/> <br />
        密码: <input type="text" name="pwd" value="<%=os[2]%>"/> <br />
        用户类型:<select name="admin" class="form-select form-select-lg mb-3" aria-label=".form-select-lg example">
            <option selected="">请选择用户类型</option>
            <option value="0" <%="0".equals(os[3].toString())?"selected":""%>>普通用户</option>
            <option value="1" <%="1".equals(os[3].toString())?"selected":""%>>会员</option>
        </select> <br />
        <input type="submit" value="保存" />

        <%} else {%>

            ID: <input type="text" name="id" /> <br />
            用户名: <input type="text" name="name" /> <br />
            密码: <input type="text" name="pwd" /> <br />
            用户类型:<select name="admin" class="form-select form-select-lg mb-3" aria-label=".form-select-lg example">
            <option selected="">请选择用户类型</option>
            <option value="0" >普通用户</option>
            <option value="1" >会员</option>
        </select> <br />
            <input type="submit" value="保存" />
        <%}%>

    </form>

</body>
</html>

posted @ 2022-10-25 21:32  ꧁ʚ星月天空ɞ꧂  阅读(11)  评论(0)    收藏  举报