会话技术
Cookie
Session
- JSP:入门学习
会话技术
会话:一次会话中包含多次请求和响应。
- 一次会话:浏览器第一次给服务器资源发送请求,会发建立,直到一方断开为止。
功能:在一次会话的范围内的多次请求间, 共享数据
方式:
- 客户端会话技术:
Cookie
- 服务器端会话技术:
Session
- 客户端会话技术:
Cookie:
概念:客户端会话技术,将数据保存到客户端
快速入门:
使用步骤:
创建
Cookie
对象,绑定数据new Cookie(String name,String value)
发送
Cookie
对象response.addCookie(Cookie cookie)
获取
Cookie
对象,拿到数据Cookie[] request.getCookies()
```java package com.jie.cookie;
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(“/cookieDemo1”) public class CookieDemo1 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建cookie对象
Cookie c = new Cookie("msg","hello");
//2.发送Cookie
response.addCookie(c);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
```java
package com.jie.cookie;
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("/cookieDemo2")
public class CookieDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//3.获取cookie
Cookie[] cookies = request.getCookies();
//4.获取数据
if (cookies != null){
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
System.out.println(name+":"+value);
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
实现原理
cookie的细节
一次可不可以发送多个cookie?
- 阔以
- 可以创建多个cookie对象,使用response调用多次addCookie方法发送cookie即可。
cookie在浏览器中保存多长时间?
默认情况下,当浏览器关闭后,Cookie数据被销毁。
设置Cookie的生命周期,持久化存储:
setMaxAge(int seconds)
- 正数:持久化将Cookie数据写到硬盘的文件中。持久化存储。cookie存活时间。
- 负数:默认值。
- 零:删除Cookie信息。 ```java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建cookie对象 Cookie c = new Cookie(“msg”,”setMaxAge”);
//2.设置cookie的存活时间
c.setMaxAge(30);//将cookie持久化到硬盘,存活30s
c.setMaxAge(-1);//默认值,浏览器一关,cookie数据就删除
c.setMaxAge(0);//0,直接删除cookie信息
//3.发送Cookie
response.addCookie(c);
}
3.
cookie能不能存中文?
- 在tomcat8之前,不能直接存储中文数据。
- 需要将中文数据转码。一般采用url编码(%E3)。
- 在tomcat8之后,可以直接存储中文数据。特殊字符不支持,
4.
cookie共享问题?
1. 假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
- 默认情况下,不能共享。
- `setPath(String path)`:设置Cookie的获取范围。默认情况下,设置当前项目的虚拟目录。
- 如果要共享,可以将path设置为`/
2. 不同tomcat服务器间cookie共享问题?
- `setDomain(String path)`:如果设置一级域名相同,那么多个服务器之间cookie可以共享
- `setDoamin(".baidu.com"),那么tieba.baidu.com 和news.baidu.com中cookie可以共享`
5.
Cookie的特点和作用
1.
cookie存储数据在客户端浏览器,不是很安全
2.
浏览器对于单个cookie的大小有限制 (4kb) 以及 对同一个域名下的总cookie数量也有限制
- 作用:
1. cookie一般用于存储少量不太敏感的数据
2. 在不登录的情况下,完成一个服务器对客户端的身份识别
6.
案例:记住上一次访问时间
1.
需求:
1. 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。
2. 如果不是第一次访问,则提示:欢迎回来,您上次的访问时间为:显示时间字符串
2.
分析:
1. 可以采用cookie完成
2. 在服务器中的Servlet中判断是否有一个名为lastTime的cookie
1. 有:不是第一次访问
1. 响应 数据:欢迎回来,您上次访问时间为xxx
2. 写回Cookie:lastTime=xxxx
2. 没有:是第一次访问
1. 响应 数据:您好,欢迎您首次访问
2. 写回Cookie:lastTime=xxxx
<a name="568878bd"></a>
## JSP:入门学习
1.
概念:
- `Java Servlet Pages`:java服务器端页面
- 可以理解为:一个特殊的页面,其中既可以定义html标签
- 用于简化书写!!!
2.
原理
- JSP本质上就是一个Servlet
3.
JSP的脚本:JSP定义java代码的方式
1. `<% 代码 %>`:定义的java代码在service方法中。service可以定义什么 ,该脚本中就可以定义什么
2. `<%! 代码 %>`:定义的java代码在jsp转换后的java类后,类的成员位置,可以定义成员方法和成员变量
3. `<%= 代码 %>`:定义的java代码会输出到页面上。输出语句可以定义什么,该脚本就可以定义什么。
4.
JSP的内置对象
- 在jsp页面不需要创建和获取,可以直接使用的对象
- jsp一共有9个内置对象。
- 三个基本的:
- `request`
- `response`
- `out`:字符输出流对象。可以将数据输出到页面上。和`response.getWriter()类似`
- `response.getWriter() 和 out的区别`:在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再去找out缓冲区数据。`response.getWriter()`永远在`out`之前。
<a name="8fa491c6"></a>
## Session:
1.
概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。`HttpSession`
2.
快速入门:
1. 获取`HttpSession对象`:
1. `Object getAttribute(String name)`
2. 使用Session对象
1. `void setAttribute(String name,Object obj)`
2. `void removeAttribute(String name)`
3.
原理
- Session的实现是依赖于Cookie的
4.
原理:
1.
当客户端关闭后,服务器端不关闭,两次获取的session是否是同一个?
- 默认情况下,不是。
- 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存
2.
客户端不关闭,服务器端关闭后,两次获取的session是否是同一个?
-
不是同一个,但是要确保数据不丢失
-
session的钝化:
- 在服务器正常关闭之前,将session对象系列化的到硬盘上
-
session的活化:
- 在服务器启动后,将session文件转化为内存中的session对象即可
3.
session什么时候被销毁?
1.
服务器关闭
1.
session对象调用一个方法`invalidate()`。
2.
session默认的实效时间是30分钟。
-
选择性修改tomcat中conf中web.xml:
```xml
<session-config>
<session-timeout>30</session-timeout>
</session-config>
session特点
- session用于存储一次会话的多次请求的数据,存在服务器端
- session可以存储任意类型,任意大小的数据
session 与 cookie的区别:
- session存储数据在服务器端,Cookie在客户端
- session没有数据大小限制,Cookie有
- session数据安全,Cookie相对于不安全
案例:验证码
案例需求
- 访问带有验证码的登录界面login.jsp
用户输入用户名,密码以及验证码
- 如果用户名和密码输入有误,跳转登录界面,提示:用户名或密码错误
- 如果验证码输入有误,跳转登录界面,提示,验证码错误
- 如果全部输入正确,则跳转到主页success.jsp,显示:用户名,欢迎您
分析
代码实现:
- javaBean ```java package com.jie.domain;
/**
用户的实体类 */ public class User {
private int id; private String username; private String password;
public User(int id, String username, String password) {
this.id = id; this.username = username; this.password = password;
}
public User() { }
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override public String toString() {
return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + '}';
} } ```
- checkCodeServlet ```java package com.jie.servlet;
import javax.imageio.ImageIO; 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.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random;
@WebServlet(“/checkCodeServlet”) public class CheckCodeServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int widih = 100;
int height = 50;
//1.创建一个对象,在内存中图片(验证码图片对象)
BufferedImage image = new BufferedImage(widih,height,BufferedImage.TYPE_3BYTE_BGR);
//2.美化图片
//2.1填充背景色
Graphics g = image.getGraphics();//画笔对象
g.setColor(Color.pink);//设置画笔颜色
g.fillRect(0,0,widih,height);
//2.2画边框
g.setColor(Color.blue);
g.drawRect(0,0,widih-1,height-1);
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
//生成随机角标
Random r = new Random();
StringBuilder sb = new StringBuilder();
for (int i1 = 1; i1 <= 4; i1++) {
int i = r.nextInt(str.length());
//获取字符
char c = str.charAt(i);//随机字符
sb.append(c);
//2.3写验证码
g.drawString(c+"",widih/5*i1,height/2 );
}
String check_session = sb.toString();
//将验证码存入session
request.getSession().setAttribute("checkCode_session",check_session);
//2.4画干扰线
g.setColor(Color.green);
//2.5生成随机坐标点
for (int i = 0; i < 7; i++) {
int x1 = r.nextInt(widih);
int x2 = r.nextInt(widih);
int y1 = r.nextInt(height);
int y2 = r.nextInt(height);
g.drawLine(x1,y1,x2,y2);
}
//3.将图片输出到页面展示
ImageIO.write(image, "jpg", response.getOutputStream());
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
3.
LoginServlet
```java
package com.jie.servlet;
import javax.imageio.ImageIO;
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.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
@WebServlet("/checkCodeServlet")
public class CheckCodeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int widih = 100;
int height = 50;
//1.创建一个对象,在内存中图片(验证码图片对象)
BufferedImage image = new BufferedImage(widih,height,BufferedImage.TYPE_3BYTE_BGR);
//2.美化图片
//2.1填充背景色
Graphics g = image.getGraphics();//画笔对象
g.setColor(Color.pink);//设置画笔颜色
g.fillRect(0,0,widih,height);
//2.2画边框
g.setColor(Color.blue);
g.drawRect(0,0,widih-1,height-1);
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
//生成随机角标
Random r = new Random();
StringBuilder sb = new StringBuilder();
for (int i1 = 1; i1 <= 4; i1++) {
int i = r.nextInt(str.length());
//获取字符
char c = str.charAt(i);//随机字符
sb.append(c);
//2.3写验证码
g.drawString(c+"",widih/5*i1,height/2 );
}
String check_session = sb.toString();
//将验证码存入session
request.getSession().setAttribute("checkCode_session",check_session);
//2.4画干扰线
g.setColor(Color.green);
//2.5生成随机坐标点
for (int i = 0; i < 7; i++) {
int x1 = r.nextInt(widih);
int x2 = r.nextInt(widih);
int y1 = r.nextInt(height);
int y2 = r.nextInt(height);
g.drawLine(x1,y1,x2,y2);
}
//3.将图片输出到页面展示
ImageIO.write(image, "jpg", response.getOutputStream());
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
login.JSP ```jsp <%— Created by IntelliJ IDEA. User: Jay Date: 2020/10/31 Time: 15:16 To change this template use File | Settings | File Templates. —%> <%@ page contentType=”text/html;charset=UTF-8” language=”java” %>