生活中的会话&BS结构的会话
在Tomcat7里面有汉字直接报500异常错误
package com.itheima.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/demo1")
public class Demo1CookieServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.使用构造方法创建一个Cookie对象,指定键和值,注意:键和值都不建议使用中文
Cookie cookie = new Cookie("user","NewBoy");
//2.将创建好的Cookie发给浏览器
response.addCookie(cookie);
//3.在默认情况下,关闭浏览器Cookie就失效失效
//设置响应类型和编码
response.setContentType("text/html;charset=utf-8");
//获取打印流
PrintWriter out = response.getWriter();
out.println("向浏览器添加了cookie数据");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
设置过期的时间
package com.itheima.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/demo1")
public class Demo1CookieServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.使用构造方法创建一个Cookie对象,指定键和值,注意:键和值都不建议使用中文
Cookie cookie = new Cookie("user","NewBoy");
cookie.setMaxAge(60*10);
//3.将创建好的Cookie发给浏览器
response.addCookie(cookie);
//设置响应类型和编码
response.setContentType("text/html;charset=utf-8");
//获取打印流
PrintWriter out = response.getWriter();
out.println("向浏览器添加了cookie数据");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
案例:读取Cookie信息
package com.itheima.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/demo2")
public class Demo2ReadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//读取数据使用请求的方法,得到Cookie数组
Cookie[] cookies = request.getCookies();
//1.设置响应类型和编码
response.setContentType("text/html;charset=utf-8");
//2.获取打印流
PrintWriter out = response.getWriter();
//判断如果数组为空,表示浏览器端没有Cookie数组
if (cookies == null) {
out.println("没有Cookie!");
} else {
//每一个元素是一个Cookie对象
for (Cookie cookie : cookies) {
//获取cookie对键和值
String name = cookie.getName();
String value = cookie.getValue();
//输出
out.println("名字是:" + name + ",值是:" + value + "
");
}
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
设置访问路径
package com.itheima.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/demo1")
public class Demo1CookieServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.使用构造方法创建一个Cookie对象,指定键和值,注意:键和值都不建议使用中文
Cookie user = new Cookie("user","NewBoy");
user.setMaxAge(60*10);
//3.将创建好的Cookie发给浏览器
response.addCookie(user);
//再创建一个cookie
Cookie age = new Cookie("age","20");
//设置他的访问地址,只有访问demo3或它的子路径,浏览器才会将Cookie发送给服务器
age.setPath(request.getContextPath()+"/demo3");
age.setMaxAge(60*10);
response.addCookie(age);
//设置响应类型和编码
response.setContentType("text/html;charset=utf-8");
//获取打印流
PrintWriter out = response.getWriter();
out.println("向浏览器添加了cookie数据");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
面试题
删除Cookie
package com.itheima.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/demo4")
public class Demo4Servlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建Cookie对象
Cookie user = new Cookie("user", "null");
//设置过期时间为0
user.setMaxAge(0);
//添加到浏览器端
response.addCookie(user);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
实现自动登录的案例
LoginServlet文件
package com.itheima.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.得到用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
//2.判断是否登录成功
if ("NewBoy".equals(username)&&"1234".equals(password)){
//登录成功,判断是否勾选"记住我"
String remember = request.getParameter("remember");
//如果没有勾选remember为空,不为空表示勾选
if(remember!=null){
//勾选的话创建cookie保存用户名
Cookie cookieUser = new Cookie("user", username);
//设置过期时间
cookieUser.setMaxAge(60 *60*24*7);
//设置只有访问登录页面login.html,才发送给Cookie给服务器
cookieUser.setPath(request.getContextPath()+"/login.html");
//写到浏览器端
response.addCookie(cookieUser);
Cookie cookiePass = new Cookie("password", password);
cookiePass.setMaxAge(60 *60*24*7);
cookiePass.setPath(request.getContextPath()+"/login.html");
response.addCookie(cookiePass);
//3.重定向跳转到成功页面
response.sendRedirect(request.getContextPath()+"/success.html");
}else {
//3.没勾选也跳转重定向跳转到成功页面
response.sendRedirect(request.getContextPath()+"/success.html");
}
}else {
//重定向跳转到失败页面
response.sendRedirect(request.getContextPath()+"/failure.html");
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
commons.js工具类(js文件夹下)
function getCookieValue(name) {
//1.得到所有的cookie
var cookies = document.cookie;
if (cookies != "") { //username=admin; password=123 注:password前面有一个空格
//2.使用分号来拆分
var strings = cookies.split(";");
for (var i = 0; i < strings.length; i++) {
var cookie = strings[i];
//3.每个元素再按"="号来拆分
var key = cookie.split("=")[0].trim(); //第0个元素是键,去掉前后的空格
var value = cookie.split("=")[1].trim();//第1个元素是值,去掉前后的空格
//14.比较名字和键是否相同,如果相同就返回value
if (name == key) {
return value;
}
}
}
return null;
}
failure.html(登录失败)
登录失败
登陆失败
点我重新登录
success.html(登录成功)
登录成功
登录成功欢迎你
login.html(用户登录)
Title
用户登录
HttpSession
HttpSession介绍
Cookie和Session的主要区别
Tomcat保留会话重启或者重新发布
会话对象的方法
package com.itheima.Servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Timestamp;
@WebServlet("/demo1")
public class Demo1SessionServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
//1.设置响应类型和编码
response.setContentType("text/html;charset=utf-8");
//2.获取打印流
PrintWriter out = response.getWriter();
out.println("会话对象:"+session+"
");
//获取每个用户的会话id值:32位的十六进制数组成,而且是唯一的
out.println("会话id为:"+session.getId()+"
");
out.println("是否是新会话:"+session.isNew()+"
");
//返回的是一个毫秒值,需要转时间戳来显示.
out.println("创建时间:"+new Timestamp(session.getCreationTime()) +"
");
out.println("创建最后一次发访问的时间:"+new Timestamp(session.getLastAccessedTime()) +"
");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
会话域的操作方法
会话作用域
创建会话域键和值
package com.itheima.Servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/demo2")
public class Demo2SetServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取会话域对象
HttpSession session = request.getSession();
//向会话域中添加值和键
session.setAttribute("knickknack","布娃娃");
//1.设置响应类型和编码
response.setContentType("text/html;charset=utf-8");
//2.获取打印流
PrintWriter out = response.getWriter();
//打印点东西
out.println("设置了一个会话域对象");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
获取会话域的键和值
package com.itheima.Servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/demo3")
public class Demo3GetServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取会话域对象
HttpSession session = request.getSession();
//从会话域中取值
String knickknack = (String) session.getAttribute("knickknack");
//1.设置响应类型和编码
response.setContentType("text/html;charset=utf-8");
//2.获取打印流
PrintWriter out = response.getWriter();
out.println("产品是:"+knickknack+"
");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
会话访问的原理(Session)
HttpSession的一些疑问
可以配钥匙(自己写个cookie用来存Session的id)服务器端默认存30分钟
案例保存JSESSIONID
package com.itheima.Servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/dem4")
public class Demo3IntervalServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置响应类型和编码
response.setContentType("text/html;charset=utf-8");
//2.获取打印流
PrintWriter out = response.getWriter();
//获取会话对象
HttpSession session = request.getSession();
//浏览器输出会话对象id
out.println("会话对象:"+session.getId()+"
");
//获取服务器会话过期最大时间:秒
//int maxInactiveInterval = session.getMaxInactiveInterval();
//浏览器端输出过期时间
//out.println("过期时间"+maxInactiveInterval+"
");
//方式一:设置会话对象最大过期时间为10s
//ession.setMaxInactiveInterval(10);
//浏览器端输出过期时间
out.println("过期时间:"+session.getMaxInactiveInterval()+"
");
//方式二:会话立马过期:适用于用户退出
//session.invalidate();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
方式三通过配置文件修改
浏览器端禁用Cookie的处理方式5
WelcomeServlet
login.html
登录页面
用户登录
PicCodeServlet
package com.itheima.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 javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
@WebServlet("/https://blog.csdn.net/anyi2351033836/article/details/code")
public class PicCodeServlet extends HttpServlet {
//随机类
private Random random = new Random();
private Color getRandomColor() {
//随机得到r,g,b的取值,范围是0~255
int r = random.nextInt(256);
int g = random.nextInt(256);
int b = random.nextInt(256);
//red红 green绿 blue蓝
return new Color(r, g, b);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置MIME类型
response.setContentType("image/jpeg");
//定义宽和高的值
int width = 90;
int height = 30;
//1,创建一张图片,参数:宽,高,图片模式
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//获取画笔对象
Graphics graphics = image.getGraphics();
//整个图片填充白色
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, width, height);
//2.随机绘制4个验证码
char[] arr = {'A', 'B', 'C', 'D', 'N', 'E', 'W', 'b', 'o', 'y', '1', '2', '3', '4', '5', '6', '7', '8'};
//设置字体,字体对象有三个参数:字体名字,字体样式(加粗,斜体)大小
graphics.setFont(new Font(Font.DIALOG_INPUT, Font.BOLD + Font.ITALIC, 19));
//创建一个stringBuilder
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++) {
//随机获取1个索引号
int index = random.nextInt(arr.length);
//随机获取字符数组的一个字符
char c = arr[index];
//添加到字符串中
sb.append(c);
//每个字符的颜色不同
graphics.setColor(getRandomColor());
//写字符,参数:文字内容,xy坐标(把字符转成字符串)
graphics.drawString(String.valueOf(c), 10 + (i * 20), 20);
}
//将字符串放在会话域中
HttpSession session = request.getSession();
session.setAttribute("https://blog.csdn.net/anyi2351033836/article/details/code", sb.toString());
System.out.println("验证码:" + sb);
//3.绘制8条干扰线
for (int i = 0; i < 8; i++) {
//指定颜色
graphics.setColor(getRandomColor());
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
int x2 = random.nextInt(width);
int y2 = random.nextInt(height);
//画线,起点和终点
graphics.drawLine(x1, y1, x2, y2);
}
//4.把图片输出到浏览器,参数:输出的图片对象,图片格式,响应输出流
ImageIO.write(image, "jpg", response.getOutputStream());
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
LoginServlet
package com.itheima.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取会话对象
HttpSession session = request.getSession();
//从会话域中获取验证码
String https://blog.csdn.net/anyi2351033836/article/details/code = (String) session.getAttribute("https://blog.csdn.net/anyi2351033836/article/details/code");
//从用户输入框中获取验证码
String vhttps://blog.csdn.net/anyi2351033836/article/details/code = request.getParameter("vhttps://blog.csdn.net/anyi2351033836/article/details/code");
//设置响应类型和编码
response.setContentType("text/html;charset=utf-8");
//获取打印流
PrintWriter out = response.getWriter();
//验证码只用一次
session.removeAttribute("https://blog.csdn.net/anyi2351033836/article/details/code");
//1.判断验证码是否正确
if (!https://blog.csdn.net/anyi2351033836/article/details/code.equalsIgnoreCase(vhttps://blog.csdn.net/anyi2351033836/article/details/code)){
//验证码不匹配,就提示一下,跳回初始页面
out.println("");
}else {
//验证码正确再判断用户名和密码
String name = request.getParameter("name");
String password = request.getParameter("password");
if ("NewBoy".equals(name)&&"1234".equals(password)){
//验证通过成功登录,需要将用户的信息保存在会话域中
session.setAttribute("user",name);
//跳转到登录成功的页面
response.sendRedirect(request.getContextPath()+"/welcome");
}else {
out.println("");
}
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
WelcomeServlet
package com.itheima.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/welcome")
public class WelcomeServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置响应类型和编码
response.setContentType("text/html;charset=utf-8");
//2.获取打印流
PrintWriter out = response.getWriter();
//获取会话对象
HttpSession session = request.getSession();
//获取用户信息
String user = (String) session.getAttribute("user");
//判断会话域中是否有用户信息,如果没有则是没有登录的
//(预防插队)
if (user==null){
response.sendRedirect(request.getContextPath()+"login.html");
//必须加上,否则后面代码还会继续执行
return;
}else {
//显示页面
out.println("欢迎您!jack!!!");
//退出连接
out.println("退出");
}}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
LogoutServlet
package com.itheima.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取会话对象
HttpSession session = request.getSession();
//销毁会话对象
session.invalidate();
//重定向到首页登录
response.sendRedirect(request.getContextPath()+"login.html");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
小结
能够说出会话的概念
能够创建,发送.接收,删除Cookie
能够说出Cookie执行原理
能够说出Session的概念
能够获取session对象,添加,删除,获取session中的数据


