会话的概念
用户打开浏览器,浏览不同的网页(资源),发出多个请求,直到关闭浏览器的过程,称为一次会话(多次请求). 如同打电话.
我们在会话的过程(多次请求)之中,用户可能会产生一些数据,这些数据话有的需要保存起来的,我们就可以通过会话技术来保存用户各自的数据
为什么要使用会话技术
保存一次通话过程中的数据!
会话技术中数据的保存方式:
浏览器存储会话数据:cookie
服务器存储会话数据:session
常用的会话技术
cookie(记住用户名密码)
cookie是客户端(浏览器)的技术,用户浏览的信息以键值对(key=value)的形式保存在浏览器上。如果没有关闭浏览器,再次访问服务器,会把cookie带到服务端,服务端就可以做响应的处理。
session(记住登录用户名 购物车)
所有用户在访问的时候,可以把信息保存在session对象中。同时,每一个session对象都对应一个sessionId,服务器把sessionId写到cookie中,再次访问的时候,浏览器会把cookie(sessionId)带过来,找到对应的session对象。
小结
-
会话概念
-
会话就相当于一次通话,表示从浏览器和服务器的一次通话过程【多次请求和响应】
-
会话建立:打开浏览器第一次请求服务器
-
会话结束:直到浏览器和服务器有一方关闭
-
-
为什么要使用会话技术?
-
要保持一次会话中的重要数据
-
客户端会话技术:cookie 表示将数据保存在浏览器
-
服务端会话技术:session 表示将数据保存在服务器
-
什么是Cookie
cookie:客户端的会话技术,保存数据在浏览器!
cookie:一个名称和一个值 一些可选属性 cookie存储的数据大小和个数都有限
cookie写入:response.addCookie() 将cookie从服务器 写入到浏览器
cookie获取:request.getCookies()
Cookie的作用
-
在浏览器中存放数据
-
将浏览器中存放的数据携带到服务器
Cookie的应用场景
1.记住用户名
当我们在用户名的输入框中输入完用户名后,浏览器记录用户名,下一次再访问登录页面时,用户名自动填充到用户名的输入框.
2.自动登录(记住用户名和密码)
当用户在淘宝网站登录成功后,浏览器会记录登录成功的用户名和密码,下次再访问该网站时,自动完成登录功能.
以上这些场景都是使用会话cookie实现的,将上次的信息保存到了cookie中,下次直接从cookie中获取数据信息
3.保存网站的上次访问时间
我们访问网站的时候,通常会看到网站上显示上次访问时间,这些信息就是在用户访问网站的时候保存在cookie中的
4.保存电影的播放进度
在网页上播放电影的时候,如果中途退出浏览器了,下载再打开浏览器播放同一部电影的时候,会自动跳转到上次退出时候的进度,因为在播放的时候会将播放进度保存到cookie中
小结
cookie:客户端会话技术,将数据保存在浏览器。使用cookie保存用户各自的数据
cookie特点:
-
cookie保存会话数据在客户端浏览器
-
cookie保存数据大小以及个数有限
cookie使用场景:
-
记住用户名和密码【登录前】
-
自动登录
-
记录上次访问时间
-
记录电影播放进度
Cookie的快速了解
相关的API
- 创建一个Cookie对象(cookie只能保存字符串数据。可以保存中文 但是要求tomcat版本8.5+)
new Cookie(String name,String value);
- 把cookie写入浏览器
response.addCookie(cookie);
- 获得浏览器带过来的所有Cookie:
request.getCookies() ; //得到所有的cookie对象。是一个数组,开发中根据key得到目标cookie
- cookie的 API
cookie.getName() ; //返回cookie中设置的name
cookie.getValue(); //返回cookie中设置的value
代码:
@WebServlet("/cookie01")
public class CookieServlet01 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("CookieServlet01...");
//设置cookie 响应给客户端浏览器
//1.创建Cookie对象
Cookie cookie = new Cookie("name", "shuaige");
//2.使用response将cookie输出到客户端浏览器
response.addCookie(cookie);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
@WebServlet("/cookie02")
public class CookieServlet02 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("CookieServlet02...");
//3.获取客户端请求携带的cookie数据
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
System.out.println(cookie.getName()+" "+cookie.getValue());
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
cookie工具类抽取
package com.execise.utils;
import javax.servlet.http.Cookie;
public class CookieUtils {
//根据cookie的name获取cookie的value
public static String getCookieValue(Cookie[] cookies,String name){
//如果cookies数组 为null 或者 cookie的name为null或空串 直接返回null
if (cookies==null || name==null || name.equals("")){
return null;
}
for (Cookie cookie : cookies) {
if(cookie.getName().equals(name)){
return cookie.getValue();
}
}
return null;
}
}
小结
-
cookie的特点
-
cookie是一门客户端会话技术,保存数据在客户端浏览器
-
cookie在第一次请求时没有,通过服务器以响应头的方式写给浏览器,在浏览器第二次发送 请求时,就会携带cookie到服务器
-
cookie存储的字符串数据
-
cookie存储的大小以及个数有限
-
cookie存储数据不安全 因此cookie会存储一些私人数据或不重要的数据
-
-
cookie使用的API
-
创建Cookie对象:Cookie cookie = new Cookie(String name,String value);
-
cookie写入:response.addCookie(cookie);
-
cookie获取:Cookie[] cookies = request.getCookies();
-
获取cookie名称:cookie.getName();
-
获取cookie值:cookie.getValue();
-
Cookie深入了解
cookie的分类
- 会话级别cookie
在默认的情况下,当浏览器进程结束(浏览器关闭,会话结束)的时候,cookie就会消失。
-
持久性cookie
给cookie设置有效期.
cookie.setMaxAge(int expiry)
:时间是秒 -1:默认 会话级别。代表Cookie数据存到浏览器关闭(保存在浏览器文件中)。
正整数:以秒为单位保存数据有有效时间(把缓存数据保存到磁盘中)
0:代表删除Cookie.如果要删除Cookie要确保路径一致。
@WebServlet("/cookie03")
public class CookieServlet03 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("CookieServlet03...");
//设置cookie 响应给客户端浏览器
//1.创建Cookie对象
Cookie cookie = new Cookie("name", "shuaige");
//设置cookie的有效时间 -1:默认会话级别,浏览器一关闭cookie消失 0:删除cookie
//cookie.setMaxAge(60*2);
cookie.setMaxAge(0);
//2.使用response将cookie输出到客户端浏览器
response.addCookie(cookie);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
cookie设置有效路径
setPath(String url) ;设置路径
有效路径作用 :
-
保证不会携带别的网站/项目里面的cookie到我们自己的项目(一个是域名ip地址隔离,一个路径隔离)
-
如果路径不一样, cookie的name可以相同
-
保证自己的项目可以合理的利用自己项目的cookie(默认路径: /项目部署路径 eg:/day24)
-
默认路径,例如:
- 访问http://localhost:8080/day24/demo01; cookie默认路径 /day24
-
访问http://localhost:8080/day24/aaa/demo01; cookie默认路径 /day24/aaa
-
访问http://localhost:8080/day24/aaa/bbb/demo01; cookie默认路径 /day24/aaa/bbb
-
携带Cookie需要的条件: 只有当访问资源的url上一级目录与此cookie的有效path完全匹配的时候,才会携带这个cookie; url上一级目录如果是cookie有效路径的子目录也可以获取到反之不会.
-
eg:setPath(“/”)
-
http://localhost:8080/day23/cookieDemo /day23是/的子目录
-
http://localhost:8080/day24/cookieDemo02 /day24是/的子目录
-
eg: 设置cookie的路径 /day24/demo02
下次访问路径:http://localhost:8080/day24/demo02/abc/ccc; cookie是可以带过来
下次访问路径:http://localhost:8080/day24/demo03; cookie带不过来
-
-
cookie的路径通常设置 / 或者为发布项目名设置的有效是 /day24. 当前项目下的Servlet都可以使用该cookie. 一般这么设置: cookie.setPath(request.getContextPath());
只要是当前项目里面的资源 路径必须包含项目名路径.
@WebServlet("/aa/cookie04")
public class CookieDemo04 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("CookieDemo04...");
//cookie的基本使用
//1.创建Cookie对象
//cookie使用细节1:cookie原来不可以存中文和特殊字符 tomcat8.5版本之后可以存储中文但是依然不能存储特殊字符
//cookie如果想存储特殊字符 需要将cookie的value使用URLEncoder进行编码,获取时就需要使用URLDecoder解码
//cookie存入时编码:URLEncoder.encode(value,"UTF-8");
//cookie取出时解码:URLDecoder.decode(value,"UTF-8");
String value = URLEncoder.encode("黄 文 龙", "UTF-8");
Cookie cookie = new Cookie("name",value);
//cookie使用细节2:可以一次写入多个cookie
Cookie cookie1 = new Cookie("address", "深圳");
cookie.setPath(request.getContextPath());
cookie1.setPath("/day25");
//2.使用response将cookie写入到浏览器
response.addCookie(cookie);
response.addCookie(cookie1);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
小结
-
Cookie的有效时长:cookie.setMaxAge(int seconds)
-
-1:默认值,表示会话级别 浏览器一关闭则cookie删除
-
0:删除cookie
-
正整数:表示cookie的有效时间 单位是秒
-
-
cookie的有效路径:cookie.setPath(String path);
-
不同路径下的cookie名称可以一样
-
cookie默认路径是当前Servlet所在资源路径
-
cookie有效路径一般设置为当前项目的虚拟路径:setPath(request.getContextPath());
-
cookie存储设置路径,在其路径同级目录和子目录下都可以访问到该cookie
-
-
cookie存储中文及特殊字符
-
tomcat已经解决了cookie中文存储,但是仍然不能存储特殊字符,比如空格…
-
存储时编码:URLEncoder.encode(value,“UTF-8”);
-
获取时解码:URLDecoder.decode(value,“UTF-8”);
-
-
cookie可以一次存储多个
记录用户各自的上次访问时间
在访问一个资源的时候,展示上次访问的时间
若是第一次访问则展示:你是第一次访问,若不是第一次则展示:你上次访问的时间是:xxxx
代码:
package com.execise.web.cookie;
import com.execise.utils.CookieUtils;
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;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
@WebServlet("/rem")
public class RememberServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//请求响应中文乱码处理
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
Cookie[] cookies = request.getCookies();
//1.根据cookie的name【lastTime】获取上次访问时间
String lastTime = CookieUtils.getCookieValue(cookies, "lastTime");
//2.判断value
if(lastTime==null){
//3.1:value==null:第一次访问
//获取当前时间,记录在cookie中,写入到浏览器
String dateStr = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
Cookie cookie = new Cookie("lastTime", URLEncoder.encode(dateStr,"UTF-8"));
response.addCookie(cookie);
//响应浏览器 用户 你是第一次访问
response.getWriter().print("你是第一次访问!");
}else{
//3.2:value!=null:显示上次访问时间
//获取当前时间,记录在cookie中,写入到浏览器
String dateStr = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
Cookie cookie = new Cookie("lastTime", URLEncoder.encode(dateStr,"UTF-8"));
response.addCookie(cookie);
//响应浏览器 用户 你上次访问的时间
response.getWriter().print("你上次访问时间是:"+ URLDecoder.decode(lastTime,"UTF-8"));
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
小结
什么是Session
session是服务器端的会话技术,用于保存数据在请求间实现数据共享。
session是服务器端的会话技术。服务器为每一个浏览器开辟一块内存空间,即session对象。由于session对象是每一个浏览器特有的,所以用户的记录可以存放在session对象中。同时,每一个session对象都对应一个sessionId,服务器把sessionId写到cookie中,再次访问的时候,浏览器把sessionId带过来,找到对应的session对象
cookie和Session的不同
-
Session将数据保存在服务器端,cookie将数据保存在客户端浏览器
-
session一般保存比较重要的数据,cookie保存的相对不重要比较私人的数据
-
session存储的是对象Object,cookie存储的是字符串数据
-
session在数据的存储上没有限制,cookie存储数据量大小以及个数都有限制
-
session是基于cookie实现的
Session的执行原理
1、获得cookie中传递过来的SessionId(cookie)(浏览器请求服务器会将该项目路径下的cookie带过去)
2、如果Cookie中没有sessionid,则创建session对象(第一次调用request.getSession()创建Session对象)
3、如果Cookie中有sessionid,找指定的session对象
如果有sessionid并且session对象存在,则直接使用
如果有sessionid,但session对象销毁了,则执行第二步
注意:
- 第一次调用request.getSession()才会创建session对象,不调用则session对象不存在
- session对象的生命周期范围就是从第一次调用request.getSession(),session对象被创建,当关闭浏览器,session对象被持久化到硬盘
- session对象在创建时,会自动产生sessionId,由服务器通过cookie方式写入到浏览器缓存中,该cookie的name是JSESSIONID
小结
session:服务器端会话技术,保存数据在服务器内存中。
cookie和session的区别:
-
cookie存储会话数据在客户端浏览器,session存储数据在服务器
-
cookie存储的是字符串数据,session存储的是Object对象
-
cookie存储的数据量大小和个数有限,session没有限制
-
cookie一般存储不重要的数据,session存储重要数据
-
session基于Cookie实现的
session工作原理:
-
第一次请求,通过request.getSession()创建session对象
-
创建完session对象时,会生成sessionId,保存到cookie中响应给客户端浏览器
-
第二次请求时,客户端浏览器会携带sessionId到服务器,服务器就根据sessionId找到对应的session对象使用
Session的基本使用
ServletContext:整个应用
request:一次请求
Session使用:作为域对象存储数据使用
范围: 一次会话(多次请求) 保存用户各自的数据(以浏览器为单位)
-
request.getSession(); 获得session(如果第一次调用的时候其实是创建session,第一次之后通过sessionId找到session进行使用)
-
Object getAttribute(String name) ;获取值
-
void setAttribute(String name, Object value) ;存储值
-
void removeAttribute(String name) ;移除
@WebServlet("/session01")
public class SessionServlet01 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("SessionServlet01...");
//使用Session共享数据 范围:一次会话:多次请求中
//1.获取Session对象
HttpSession session = request.getSession();
//2.调用方法存储数据
session.setAttribute("sname","优秀");
System.out.println("session01:"+session);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
@WebServlet("/session02")
public class SessionServlet02 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("SessionServlet02...");
//获取session中的共享数据
HttpSession session = request.getSession();
Object sname = session.getAttribute("sname");
System.out.println("sname = " + sname);
System.out.println("session02:"+session);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
session有效期
方式一:tomcat设置session失效时间,默认30min
conf/web.xml
方式二:设置失效时间 setMaxInactiveInterval(); 单位是秒
方式三:手动设置失效 invalidate();
@WebServlet("/session03")
public class SessionServlet03 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("SessionServlet03...");
//获取session中的共享数据
HttpSession session = request.getSession();
//设置session失效
//方式二:设置失效时间 单位是秒 正数表示有效时间 负数表示永远不会过时
//session.setMaxInactiveInterval(20);
//方式三:手动设置失效 立即失效
session.invalidate();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
session持久化
1.浏览器关闭,会话结束,此时session对象有没有被销毁?没有
session对象虽然还存在,但是找不到了!因为新打开浏览器发起请求,产生了一个新的sessionId,找不到 原来的session对象了。
@WebServlet("/session04")
public class SessionServlet04 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("SessionServlet01...");
//使用Session共享数据 范围:一次会话:多次请求中
//1.获取Session对象
HttpSession session = request.getSession();
//2.调用方法存储数据
session.setAttribute("sname","优秀");
System.out.println("session01:"+session.getId());
System.out.println("session01:"+session);
//将sessionId存入 cookie中
Cookie cookie = new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(60);
response.addCookie(cookie);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
2.如果服务器正常关闭,浏览器没有关闭,session对象有没有被销毁?还能不能获取到session中存储的数据?
session钝化:指的是服务器正常关闭,会自动将session数据持久化保存到硬盘的文件上。
session活化:指的是服务器正常启动,会将持久化的session数据加载到内存中,重新创建一个session对象,存储活化后的数据,但是sessionId没有改变。
注意:session的钝化和活化是服务器自动完成的,我们了解服务器的这种机制即可。
小结
-
session基本使用 范围:一次会话【多次请求】
-
获取session对象 :request.getSession();
-
存值:session.setAttribute(key,value);
-
取值:session.getAttribute(key);
-
移除:session.removeAttribute(key);
-
-
session有效期设置
-
设置有效时间:session.setMaxInactiveInterval(int seconds);
-
手动设置失效:session.invalidate();
-
三个域对象比较
三个域对象比较
域对象 | 创建 | 销毁 | 作用范围 | 应用场景 |
---|---|---|---|---|
ServletContext | 服务器启动 | 服务器正常关闭/项目从服务器移除 | 整个项目 | 记录访问次数,聊天室 |
HttpSession | 第一次调用request.getSession()方法 | session过期(默认30分钟)/调用invalidate()方法/服务器正常关闭 | 会话(多次请求) | 验证码校验, ==保存用户登录状态==等 |
HttpServletRequest | 来了请求 | 响应这个请求(或者请求已经接收了) | 一次请求 | servletA和jsp(servletB)之间数据传递(转发的时候存数据) |
范围:httpServletReques【一次请求】–> HttpSession【一次会话】 --> ServletContext【整个应用】
基本使用:
存储数据:setAttribute(String name,Object value);
获取数据:getAttribute(String name);
移除数据:RemoveAttribute(String name);
三个域对象怎么选择?
-
常规选择:一般使用范围最小的能完成就选择最小的
-
具体请求选择:
-
转发:使用request作用域 重定向:使用session
-
查询:使用request作用域
-
根据范围:一次请求:【request】 一次会话:【session】 整个应用:【ServletContext】
-
一次性验证码校验
在网站登录的时候,生成一个验证码.登录的时候对验证码进行校验.
分析
创建登录页面login.html
验证码图片生成
-
导入验证码生成工具类CheckCodeUtil
-
编写验证码生成Servlet CodeServlet
生成验证码
响应给页面
填写登录信息以及验证码,进行验证码比对登录LoginServlet
登录页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--
login.html:http://localhost:8080/login.html
CheckcodeServlet:http://localhost:8080/checkcodeServlet
-->
<center>
<h1>用户登录</h1>
<form action="login" method="post">
姓名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
验证码:<input type="text" name="checkCode"/><br/>
<!--
src="checkcodeServlet":
表示打开login.html页面 加载img标签的src属性,向http://localhost:8080/checkcodeServlet获取图片展示
-->
<img id="imgId" src="checkcodeServlet" alt="" onclick="changeImg()"><br/>
<input type="submit" value="登录"/>
</form>
<script>
//点击img标签图片 就调用一次changeImg函数 向后台checkcodeServlet发送一次新的请求,获取一张新的验证码图片
function changeImg() {
console.log("切换验证码图片");
//当点击验证码图片没有发起新的请求切换验证码的原因是 src=checkcodeServlet 新的路径和原来的路径一致,导致浏览器以外你没有发起新的请求,依然使用原来的图片
//忽悠浏览器 点击一次验证码图片 就让浏览器发起一次新的请求 获取新的验证码展示【当请求地址不一样时,浏览器就会认为是一次新的请求】
document.getElementById("imgId").setAttribute("src","checkcodeServlet?a="+new Date().getTime());
}
</script>
</center>
</body>
</html>
CodeServlet
package com.execise.web;
import com.execise.utils.CheckCodeUtil;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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.io.IOException;
@WebServlet("/checkcodeServlet")
public class CheckcodeServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//0.获取session对象【提前使用request获取session对象 不要在响应之后再去使用request对象】
HttpSession session = request.getSession();
//1.通过工具类 生成验证码图片 使用response将验证码图片写给客户端浏览器展示
ServletOutputStream os = response.getOutputStream();
String verityCode = CheckCodeUtil.outputVerifyImage(200, 50, os, 4);
System.out.println("后台生成的验证码:verityCode = " + verityCode);
//2.将生成的验证码保存在Session域对象中
session.setAttribute("verityCode",verityCode);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
LoginServlet
package com.execise.web;
import com.execise.bean.User;
import com.execise.dao.UserDao;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
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;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
SqlSession sqlSession = null;
try {
//* 0.处理请求响应中文乱码
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//* 1.获取请求参数【用户名和密码】
Map<String, String[]> parameterMap = request.getParameterMap();
User user = new User();
BeanUtils.populate(user,parameterMap);
/*==================使用验证码登录开始===================*/
//1.获取用户输入的验证码
String checkCode = parameterMap.get("checkCode")[0];
//2.和后台生成的验证码进行比对
//2.1:获取后台生成的验证码
String verityCode = (String) request.getSession().getAttribute("verityCode");
//用户输入的验证码为空 或者 用户输入的验证码和后台生成的验证码不一致
if(checkCode==null || !checkCode.equalsIgnoreCase(verityCode)){
// 3.1:不一致:响应用户 “验证码输入有误!”
response.getWriter().print("验证码输入有误!");
return;
}
// 3.2:一致:进行登录功能处理【省略】
/*==================使用验证码登录结束===================*/
//* 2.根据用户名和密码使用MyBatis查询数据库tb_user表 返回user对象
//2.1:加载MyBatis配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//2.2:获取SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//2.3:获取SqlSession对象
sqlSession = sqlSessionFactory.openSession();
//2.4:获取dao接口代理对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
//2.5:调用方法
User loginUser = userDao.select(user);
//* 3.判断loginUser对象是否为null
if(loginUser==null){
//* 3.1:loginUser==null:登录失败
response.getWriter().print("登录失败!");
}else{
//* 3.2:loginUser!=null:登录成功
response.getWriter().print("登录成功!");
}
} catch (Exception e) {
e.printStackTrace();
response.getWriter().print("服务器异常!");
}finally {
if(sqlSession!=null){
sqlSession.close();
}
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
小结
-
验证码生成存储:
-
生成:直接使用工具类jar包生成
-
存储:要将生成的验证码存入到Session中
-
-
思路:
-
生成验证码
-
登录Servlet中比对用户输入的验证码和后台生成的验证码
-
-
根据用户名密码查询数据库
-
user!=null:登录成功
-
user==null:登录失败
-
总结
-
会话
-
概念:浏览器和服务器的一次通话过程,称为会话
-
会话产生:第一次打开浏览器,请求服务器并建立连接
-
会话结束:指定服务器或浏览器两方有一方断开,会话结束
-
会话技术:保存会话过程中产生的数据
-
cookie:保存数据在客户端浏览器
-
session:保存数据在服务器端
-
-
-
Cookie
-
概念:客户端的会话技术
-
基本使用
//1.创建Cookie对象 Cookie cookie = new Cookie(String name,String value); //2.写入cookie到浏览器 response.addCookie(cookie); //3.获取Cookie request.getCookies(); cookie.getName(); cookie.getValue();
-
进阶使用
//1.设置Cookie的有效时长 cookie.setMaxAge();//-1:默认 会话级别 正整数:有效时间s 0:删除当前Cookie //2.设置Cookie的有效路径 cookie.setPath(); //3.Cookie存储中文和特殊字符 URLEncoder.encode(value); //编码 URLDecoder.decode(value); //解码
-
-
Session
-
概念:服务器端的会话技术
-
基本使用
//获取Session对象 request.getSession(); //存储数据 setAttribute(String name,Object value); //获取数据 getAttribute(String name); //移除数据 removeAttribute(Sring name);
-
进阶使用
//1.设置Session的有效时间 session.setMaxInactiveInterval(20); //单位是s //2.在tomcat的web.xml中设置Session有效时间 单位是minutes //3.设置Session手动失效 session.invalidate(); /*4.session持久化 1.手动持久化 将SessionId存入到Cookie,并设置有效时间 2.自动持久化 服务器完成 ,当服务器正常关闭,进行Session钝化, 当重启服务器,进行Session活化 */
-