cookie、session
7.1 会话
会话:
用户打开一个浏览器,点击了很多超链接,访问许多web资源,关闭浏览器,这个过程就叫一次会话
有状态会话:
你能怎么证明你是本校的学生? 发票、学校登记
7.2 保存会话的两种技术
cookie
- 客户端技术(响应、请求)
session
- 服务器技术、利用这个技术,可以保存用户的会话信息,我们可以把信息或者数据放在session中!
常见场景:网站登录之后,你下次就不用登录了,直接可以进入
7.3 cookie
package com.kuang.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;
import java.io.PrintWriter;
import java.util.Date;
//保存用户上一次访问的时间
public class CookieDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//服务器,告诉你,你来的时间,把这个时间封装为一个信件,你下次来,我就知道你来了
// 解决中文乱码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
//cookie,服务器从客户端获取
Cookie[] cookies = req.getCookies();//这里返回数组,说明cookie可能存在多个
// 判断cookie是否存在
if(cookies!=null){
//如果存在怎么办
out.write("你上次访问的时间是:");
for (int i = 0; i <cookies.length ; i++) {
Cookie cookie = cookies[i];
//获取cookie的名字
String name = cookie.getName();
if(name.equals("lastLoginTime")){
//获取cookie中的值
String value = cookie.getValue();
long l = Long.parseLong(value);
Date date = new Date(l);
out.write(date.toLocaleString());
}
}
}else{
out.write("这是您第一次访问本站");
}
//服务器给客户端响应一个cookie
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
// Cookie cookie = new Cookie("name","111");
cookie.setMaxAge(24*60*60);//cookie有效期为1天
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
1、从请求中拿到cookie信息
2、服务器响应给客户端cookie
Cookie[] cookies = req.getCookies();//获得cookie
cookie.getName();//获得cookie中的key
cookie.getValue();//获取cookie中的值value
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");//新建一个cookie
cookie.setMaxAge(24*60*60);//设置cookie有效期
resp.addCookie(cookie);//响应给客户端一个cookie
cookie:一般会保存在本地的 用户目录下 appdata
一个网站的cookie是否存在上限?细节?
- 一个cookie只能保存一个信息
- 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
- cookie大小有限制4kb
- 300个cookie浏览器上限
删除cookie:
- 不设置有效期,关闭浏览器,自动失效
- 设置有效期时间为0
删除cookie
package com.kuang.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;
import java.io.PrintWriter;
import java.util.Date;
//保存用户上一次访问的时间
public class CookieDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//服务器,告诉你,你来的时间,把这个时间封装为一个信件,你下次来,我就知道你来了
// 解决中文乱码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
//cookie,服务器从客户端获取
Cookie[] cookies = req.getCookies();//这里返回数组,说明cookie可能存在多个
// 判断cookie是否存在
if(cookies!=null){
//如果存在怎么办
out.write("你上次访问的时间是:");
for (int i = 0; i <cookies.length ; i++) {
Cookie cookie = cookies[i];
//获取cookie的名字
String name = cookie.getName();
if(name.equals("lastLoginTime")){
//获取cookie中的值
String value = cookie.getValue();
long l = Long.parseLong(value);
Date date = new Date(l);
out.write(date.toLocaleString());
}
}
}else{
out.write("这是您第一次访问本站");
}
//服务器给客户端响应一个cookie
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
// Cookie cookie = new Cookie("name","111");
cookie.setMaxAge(24*60*60);//cookie有效期为1天
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
中文数据怎么传递
package com.kuang.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;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Date;
//中文数据怎么传递
public class CookieDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 解决中文乱码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
//cookie,服务器从客户端获取
Cookie[] cookies = req.getCookies();//这里返回数组,说明cookie可能存在多个
// 判断cookie是否存在
if(cookies!=null){
//如果存在怎么办
out.write("你上次访问的时间是:");
for (int i = 0; i <cookies.length ; i++) {
Cookie cookie = cookies[i];
//获取cookie的名字
String name = cookie.getName();
if(name.equals("name")){
//获取cookie中的值
System.out.println(cookie.getValue());
out.write(cookie.getValue());
}
}
}else{
out.write("这是您第一次访问本站");
}
//创建一个cookie,这个是可以的,但是有时为了安全,可以这样写
// URLEncoder.encode("一一一","utf-8")
// URLDecoder.decode(cookie.getValue(),"utf-8")
Cookie cookie = new Cookie("name","一一一");
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
7.4 session(重点)
什么是session:
- 服务器会给每一用户(每个浏览器是不同的用户)创建一个session对象
- 一个session独占一个浏览器,只要浏览器没有关闭,这个session就存在
- 用户登录之后,整个网站都可以访问–》保存用户的信息;保存购物车的信息
session和cookie的区别:
- cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
- session把用户的数据写到用户独占session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
- session对象由服务创建
session测试:
package com.kuang.servlet;
import com.kuang.servlet.pojo.Person;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
public class SessionDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
resp.setCharacterEncoding("utf-8");
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset='utf-8'");
//得到session
HttpSession session = req.getSession();
//给session中存东西
// session.setAttribute("name","一一一");
session.setAttribute("name",new Person("qin",111));
//获取session的id
String id = session.getId();
//判断session是不是新的
if(session.isNew()){
resp.getWriter().write("session 创建成功,ID"+id);
}else{
resp.getWriter().write("session 已存在,ID"+id);
}
/**
* session创建的时候做了什么?(猜想)
* Cookie cookie = new Cookie("JSESSIONID", id);
* resp.addCookie(cookie);
*/
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
package com.kuang.servlet;
import com.kuang.servlet.pojo.Person;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
public class SessionDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
resp.setCharacterEncoding("utf-8");
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset='utf-8'");
//得到session
HttpSession session = req.getSession();
//给session中存东西
Person name =(Person) session.getAttribute("name");
System.out.println(name.toString());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
package com.kuang.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;
public class SessionDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.removeAttribute("name");
//手动注销session
session.invalidate();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
会话自动过期:web.xml
<!-- 设置session默认的失效时间-->
<session-config>
<!-- 15分钟后session自动失效,以分钟为单位-->
<session-timeout>15</session-timeout>
</session-config>
使用场景:
- 保存一个登录用户的信息
- 购物车信息
- 在整个网站中经常使用的数据,我们将它保存在session中
cookie:
session:
8、JSP
8.1 什么是jsp
java server pages:java服务器端页面,也和servlet一样,用于动态web技术
最大的特点:
- 写jsp就像在写html
- 区别:
- html只给用户提供静态的数据
- jsp页面中可以嵌入java代码,为用户提供动态数据
8.2 jsp原理
思路:jsp怎么执行的?
- 代码层面没有任何问题
- 服务器内部工作:
tomact中由一个work目录
idea中使用tomcat的会在idea的tomcat中生成生产一个work目录
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问servlet!
jsp最终会被转换为一个java类
jsp本质上就是一个servlet!
1、判断请求
2、内置了一些对象
3、输出页面前增加的代码
4、以上的这些个对象我们可以在jsp页面中直接使用!
在jsp页面中:
- 只要是java代码就会原封不动的输出
- 如果是html代码,就会被转化为:
8.3 JSP基础语法
任何语言都有自己的语法,java中有。jsp作为java技术中的一种应用,它拥有一些自己扩充的语法(了解即可),java所有的语法都支持!
1、jsp表达式
<%-- jsp表达式
作用:用来将程序的输出到客户端
<%= 变量或者表达式%>
--%>
<%--原封不动的输出--%>
<%= new java.util.Date()%>
2、jsp脚本片段
<%-- jsp脚本片段--%>
<%
int sum=0;
for (int i = 0; i < 10; i++) {
sum+=i;
}
out.println("<h1>Sum="+sum+"</h1>");
%>
脚本片段的再实现:
<%
int x=10;
out.println(x);
%>
<p>这是一个jsp文件</p>
<%
// int x=0;
int y=2;
out.println(y);
%>
<%-- 在代码中嵌入html元素--%>
<%
for (int i = 0; i < 5; i++) {
%>
<h1>hello <%=i%> </h1>
<%
}
%>
3、jsp声明
<%! %>
<%!
static{
System.out.println("loading servlet!");
}
private int globaleVar=0;
public void kuang(){
System.out.println("kuang()");
}
%>
<%--EL表达式--%>
<%
for (int i = 0; i < 5; i++) {%>
<h1>hello,world${i}</h1>
<%
}
%>
jsp声明:会被编译到jsp的生成的java类中!
其他的,就会被生成到_jspService方法中!
在jsp中,嵌入java代码即可!
<% %> 片段
<%=%> 表达式或者值
<%!%> 全局
<%--注释--%>
html的注释:
<!-- -->
jsp的注释,不会在客户端显示,html就会!
8.4 jsp指令
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/500.jsp</location>
</error-page>
<%--定制错误页面--%>
<%--<%@ page errorPage="error/500.jsp" %>--%>
<%--显式的声明这是一个错误页面--%>
<%--<%@ page isErrorPage="true" %>--%>
<%--<%@ page pageEncoding="utf-8" %>--%>
<%--@include这个会将两个页面合二为一--%>
<%@ include file="common/header.jsp"%>
<h1>body</h1>
<%--jsp标签
jsp:include:拼接页面,本质还是2个
--%>
<jsp:include page="/common/header.jsp"/>
<h1>body</h1>
8.5 9大内置对象
- pageContext 存东西
- Request 存东西
- Response
- Session 存东西
- Application(ServletContext) 存东西
- config(ServletConfig)
- out
- page
- exception
<%--
Created by IntelliJ IDEA.
User: Yoyo
Date: 2021/12/1
Time: 21:12
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>
<%--内置对象--%>
<%
pageContext.setAttribute("name1","111");//保存的数据只在一个页面中有效
request.setAttribute("name2","222");//保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","333");//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","444");//保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>
<%--脚本片段中的代码,会被原封不动生成到.jsp.java--%>
<%--要求:这里面的代码,必须要保证java语法的正确性--%>
<%
// 通过pageContext取出我们需要的值
//从pageContext取出,我们通过寻找的方式来取
// 从底层到高层(作用域):
String name1=(String)pageContext.findAttribute("name1");
String name2=(String)pageContext.findAttribute("name2");
String name3=(String)pageContext.findAttribute("name3");
String name4=(String)pageContext.findAttribute("name4");
String name5=(String)pageContext.findAttribute("name5");//不存在
%>
<h1>取出的值</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}</h3>
<%--没有--%>
<h3> <%=name5%> </h3>
<%--null--%>
</body>
</html>
<%--
Created by IntelliJ IDEA.
User: Yoyo
Date: 2021/12/1
Time: 21:23
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>
<%
// 通过pageContext取出我们需要的值
//从pageContext取出,我们通过寻找的方式来取
// 从底层到高层(作用域):
String name1=(String)pageContext.findAttribute("name1");
String name2=(String)pageContext.findAttribute("name2");
String name3=(String)pageContext.findAttribute("name3");
String name4=(String)pageContext.findAttribute("name4");
String name5=(String)pageContext.findAttribute("name5");//不存在
%>
<h1>取出的值</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}</h3>
<%--没有--%>
<h3> <%=name5%> </h3>
<%--null--%>
</body>
</html>
jvm双亲委派机制
<%--
Created by IntelliJ IDEA.
User: Yoyo
Date: 2021/12/1
Time: 21:29
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>
<%
pageContext.forward("/index.jsp");
// request.getRequestDispatcher("/index/jsp").forward(request,response);
%>
</body>
</html>