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中即可!
3010秒失效!可以在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 自动的退出或者注销
--%>