Cookie和Session入门

523 Cookie和Session原理

如何解决HTTP协议无状态问题

HTTP是无状态的协议,客户每次读取web页面时,服务器都打开新的连接,而且服务器也不会自动维护客户的上下文信息

那么要怎么才能在多次请求之间共享信息呢(比如实现网上商店中的购物车)?

服务器端如何判断一个客户的分时段的连接是不是属于同一个客户?

session和cookie就是为解决HTTP协议的无状态采用的两种解决方案

可以采用session将信息保存在服务器端解决

可以采用cookie将信息保存在客户端解决

在这里插入图片描述

03、Session和Cookie的原理

Cookie:发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。 【卡上记录所有信息,而店家只认卡不认人。】

session:发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。 【只记用户ID,而ID的详细记录放在店家的数据库里;每次凭ID检索服务器的记录。】

524 Cookie 实现免登录案例A

在这里插入图片描述

在这里插入图片描述

package com.bjsxt.servlet;

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

@WebServlet(urlPatterns = "/DoLoginServlet")
public class DoLoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接收页面的数据 和name值保持一致
        String uname = req.getParameter("uname");
        String pwd = req.getParameter("pwd");
        /*********************服务器端校验**********************/
        if(uname==null||"".equals(uname)){
            req.getRequestDispatcher("fa.jsp").forward(req,resp);
            return;
        }






        //数据的处理
        boolean flag = false;
        if("sxt".equals(uname)&&"123".equals(pwd)){
            flag=true;
        }
        //做出响应
        if(flag){
            /*************Cookie记住我的操作*****************/

            // 申请卡片
            Cookie cookie1 = new Cookie("u",uname);
            Cookie cookie2 = new Cookie("p",pwd);
            //指定卡片的使用规则
                //指定卡片的使用范围
                //servlet04 只可以在当前项目中使用
                // /----------在整个服务器中都可以使用
                cookie1.setPath("/servlet04");
                cookie2.setPath("/servlet04");
            //把卡片交给用户
                resp.addCookie(cookie1);
                resp.addCookie(cookie2);


            //转发
            req.getRequestDispatcher("success.jsp").forward(req,resp);
        }else{

            req.getRequestDispatcher("login.jsp").forward(req,resp);
        }
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>$Title$</title>

    <script type="text/javascript" src="js/jquery-1.12.3.min.js"></script>

    <script>
        $(function () {
            $("#uname").blur(function () {
                var val = $("#uname").val();
                if(val==null||val==""){
                    $("#uname_span").text("用户名不能为空").css("color","red");
                }else{
                    $("#uname_span").text("用户名合法").css("color","green");
                }
            })

            $("#pwd").blur(function () {
                var val = $("#pwd").val();
                if(val==null||val==""){
                    $("#pwd_span").text("用户名不能为空").css("color","red");
                }else{
                    $("#pwd_span").text("用户名合法").css("color","green");
                }
            })
        })
    </script>
</head>
<body>
<%
    String name ="";
    String pwd ="";
    //获得请求对象中所有Cookie
    Cookie[] cookies = request.getCookies();
    for(Cookie cookie:cookies){
        if("u".equals(cookie.getName())){
             name =cookie.getValue();
        }
        if("p".equals(cookie.getName())){
             pwd =cookie.getValue();
        }
    }

%>
<h3>登录页面</h3>

<form  action="DoLoginServlet" method="post">

    <p>
        用户名:<input type="text" name="uname" id="uname" value="<%=name%>"/>
        <span id="uname_span">

            <%
               Object msg = request.getAttribute("msg");
               if(msg!=null){
                   out.print(msg);
               }
            %>

          </span>
    </p>

    <p>
        密码:<input type="password" name="pwd" id="pwd" value="<%=pwd%>"/>
        <span id="pwd_span"></span>
    </p>
    <p>
        记住我:<input type="checkbox"/>
    </p>
    <p>
        <input type="submit" value="登录"/>
    </p>

</form>



</body>
</html>

525 Cookie 实现免登录案例B

在这里插入图片描述

Cookie的有效时间如何查看?

记住我操作!

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>$Title$</title>

    <script type="text/javascript" src="js/jquery-1.12.3.min.js"></script>

    <script>
        $(function () {
            $("#uname").blur(function () {
                var val = $("#uname").val();
                if(val==null||val==""){
                    $("#uname_span").text("用户名不能为空").css("color","red");
                }else{
                    $("#uname_span").text("用户名合法").css("color","green");
                }
            })

            $("#pwd").blur(function () {
                var val = $("#pwd").val();
                if(val==null||val==""){
                    $("#pwd_span").text("用户名不能为空").css("color","red");
                }else{
                    $("#pwd_span").text("用户名合法").css("color","green");
                }
            })
        })
    </script>
</head>
<body>
<%
    String name ="";
    String pwd ="";
    String c = "";
    //获得请求对象中所有Cookie
    Cookie[] cookies = request.getCookies();
    for(Cookie cookie:cookies){
        if("u".equals(cookie.getName())){
             name =cookie.getValue();
             c="checked";
        }
        if("p".equals(cookie.getName())){
             pwd =cookie.getValue();
        }
    }

%>
<h3>登录页面</h3>

<form  action="DoLoginServlet" method="post">

    <p>
        用户名:<input type="text" name="uname" id="uname" value="<%=name%>"/>
        <span id="uname_span">

            <%
               Object msg = request.getAttribute("msg");
               if(msg!=null){
                   out.print(msg);
               }
            %>

          </span>
    </p>

    <p>
        密码:<input type="password" name="pwd" id="pwd" value="<%=pwd%>"/>
        <span id="pwd_span"></span>
    </p>
    <p>
        记住我:<input type="checkbox" name="ch" value="yes" <%=c%>/>
    </p>
    <p>
        <input type="submit" value="登录"/>
    </p>

</form>



</body>
</html>
package com.bjsxt.servlet;

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

@WebServlet(urlPatterns = "/DoLoginServlet")
public class DoLoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接收页面的数据 和name值保持一致
        String uname = req.getParameter("uname");
        String pwd = req.getParameter("pwd");
        //接收选择框的值
        String ch = req.getParameter("ch");

        /*********************服务器端校验**********************/
        if(uname==null||"".equals(uname)){
            req.getRequestDispatcher("fa.jsp").forward(req,resp);
            return;
        }






        //数据的处理
        boolean flag = false;
        if("sxt".equals(uname)&&"123".equals(pwd)){
            flag=true;
        }
        //做出响应
        if(flag){
            /*************Cookie记住我的操作*****************/

            // 申请卡片
            Cookie cookie1 = new Cookie("u",uname);
            Cookie cookie2 = new Cookie("p",pwd);
            //指定卡片的使用规则
                //指定卡片的使用范围
                //servlet04 只可以在当前项目中使用
                // /----------在整个服务器中都可以使用
                cookie1.setPath("/servlet04");
                cookie2.setPath("/servlet04");
                //设定cookie的有效时间
                if("yes".equals(ch)){

                    //用秒为单位 10天
                    cookie1.setMaxAge(60*60*24*10);
                    cookie2.setMaxAge(60*60*24*10);
                }else{
                    cookie1.setMaxAge(0);
                    cookie2.setMaxAge(0);
                }
            //把卡片交给用户
                resp.addCookie(cookie1);
                resp.addCookie(cookie2);


            //转发
            req.getRequestDispatcher("success.jsp").forward(req,resp);
        }else{

            req.getRequestDispatcher("login.jsp").forward(req,resp);
        }
    }
}

10天内不登录才会失效,10天之内登录,时间还是会往后顺延!

cookie是无法保存中文的!

if("尚学堂".equals(uname)&&"123".equals(pwd)){
    flag=true;
}

在这里插入图片描述

如何解决?

// 申请卡片
Cookie cookie1 = new Cookie("u", URLEncoder.encode("uname",
        "utf-8"));
if(cookies!=null) {
    for (Cookie cookie : cookies) {
        if ("u".equals(cookie.getName())) {
            name = URLDecoder.decode(cookie.getValue(),"utf-8");
            c = "checked";
        }
        if ("p".equals(cookie.getName())) {
            pwd = cookie.getValue();
        }
    }
}

526 Session 原理的讲解

在这里插入图片描述

session一个用户多个请求之间数据的共享!

request是实现一个用户一个请求!

Cookie和Session就是为了解决http无状态!

你清楚不一定能让别人清楚!

设计一个效果,欢迎XXX登录!

/*Session实现XX登录/
//获得session对象
HttpSession session = req.getSession();
//把指定数据保存到session对象中
session.setAttribute(“uname”,uname);

if(flag){
    /****************Session实现XX登录***************/
    //获得session对象
    HttpSession session = req.getSession();
    //把指定数据保存到session对象中
    session.setAttribute("uname",uname);

    /*************Cookie记住我的操作*****************/

    // 申请卡片
    Cookie cookie1 = new Cookie("u", URLEncoder.encode(uname,
            "utf-8"));
    Cookie cookie2 = new Cookie("p",pwd);
    //指定卡片的使用规则
<%--
  Created by IntelliJ IDEA.
  User: 37310
  Date: 2021/7/14
  Time: 11:40
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<base href="<%=request.getContextPath()+"/"%>">
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>成功页面</h3>
输出的值:<%
    String uname = (String)session.getAttribute("uname");
    out.print(uname);
%>
<hr/>
<a href="update.jsp">update.jsp</a>
</body>
</html>
<%--
  Created by IntelliJ IDEA.
  User: 37310
  Date: 2021/7/15
  Time: 12:37
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<base href="<%=request.getContextPath()+"/"%>">
<html>
<head>
    <title>Title</title>
    <base href="<%=request.getContextPath()+"/"%>">
</head>
<body>
<h3>update.jsp</h3>
输出的值:<%
    String uname = (String)session.getAttribute("uname");
    out.print(uname);
%>
<hr/>
<a href="delete.jsp">delete.jsp</a>
</body>
</html>
<%--
  Created by IntelliJ IDEA.
  User: 37310
  Date: 2021/7/15
  Time: 12:37
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <base href="<%=request.getContextPath()+"/"%>">
</head>
<body>
<h3>delete.jsp</h3>
输出的值:<%
    String uname = (String)session.getAttribute("uname");
    out.print(uname);
%>
</body>
</html>

success.jsp

JsessionID<%=session.getId()%>
JsessionID783954D6828207D81CF3871B0151053F

update.jsp

JsessionID783954D6828207D81CF3871B0151053F

delete.jsp

JsessionID783954D6828207D81CF3871B0151053F

527 Session 失效的时机

Session什么时候失效?

cookie可以设置时间的!

package com.bjsxt.servlet;

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

@WebServlet(urlPatterns = "/LoginOut")
public class LoginOut extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //注销session对象
        req.getSession().invalidate();
        //跳转到登录的页面
        //为什么用重定向
        resp.sendRedirect(req.getContextPath()+"/login.jsp");
    }
}
session的活动时间
session的活动时间:<%=session.getMaxInactiveInterval()%>
session的活动时间:1800
如何调时间?30分钟

在tomcat中web.xml可以配置session的失效时机!

当前服务器中所有项目的所有session

30

在这里插入图片描述

如何在当前项目中作用?可以把下面代码当放到自己项目的web.xml中即可!
30

10秒失效!可以在jsp中添加如下代码,使得当前页面session失效!

<%session.setMaxInactiveInterval(10);%>

关闭浏览器

只是改变客户端的sessionID!

528 ServletContext 统计网站的访问人数

01、需求说明:

统计网站访问人数(以登录为依据)并显示

02、实现思路

思路1:使用JSP声明,只能记录一个网页的访问次数

思路2:使用session,就好比自己的购物车一样,不符号要求

思路3:使用ServletContext(启动服务器开启,关闭服务器的时候消失)(如果服务器关了,用序列化和反序列化),一个项目/一个应用的所有用户共享一个实例,相当全局变量

统计访问人数

用户登录成功后将访问人数加1

第一个用户登录成功初始化值为1

显示访问人数

/********************使用ServletContext对象统计网站人数**************************/
//获得全局变量
ServletContext context = this.getServletContext();
//获得之前的登录人数
Integer count = (Integer) context.getAttribute("count");
if(count==null){
    //之前没人登录
    count=1;
}else{
    count++;
   
}
context.setAttribute("count",count);
<%@ page import="javax.naming.Context" %><%--
  Created by IntelliJ IDEA.
  User: 37310
  Date: 2021/7/14
  Time: 11:40
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<base href="<%=request.getContextPath()+"/"%>">
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>成功页面</h3>
输出的值:<%
    String uname = (String)session.getAttribute("uname");
    out.print(uname);
%>
<hr/>
JsessionID<%=session.getId()%>
<a href="update.jsp">update.jsp</a>
<a href="LoginOut">退出</a>
session的活动时间:<%=session.getMaxInactiveInterval()%>
<%--<%session.setMaxInactiveInterval(10);%>--%>
<hr/>
当前访问人数是:<%=application.getAttribute("count")%>
</body>
</html>
<%--
session的失效时机
A 自动的退出或者注销



--%>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值