会话技术
Http协议:无状态的协议,不记录客户端的信息,所以说客户端的请求希望说使用历史数据的话,是无法获取到之前的访问的信息数据的,这时候就需要Javaweb的会话技术去解决(两种方式)
程序将数据存储在服务器中,存储数据的格式是key-value的形式,服务器就会将这个key给客户端,每次客户端再次访问服务器的时候会将key带给服务器,如果想要获取存储数据就通过这个key去获取—》这种方式即为session,服务器给客户的key就是session的ID
session是基于服务器的
cookie是基于浏览器的
Cookie客户端的缓存技术
Cookie的信息数据存储在内存中或者存在浏览器的本地文件中
Cookie的API
创建cookie对象
Cookie cookie=new Cookie(key,value)
==>key和value
(两者都是String类型的数据)
通过响应创建Cookie(同时下一次请求服务端的时候会在请求中携带cookie)
response.addCookie(cookie对象)
设置Cookie的最久存活时间(不受关闭浏览器影响:如果不设这个最大时间,就默认跟浏览器一样,浏览器关闭就销毁,如果设置时间长于使用浏览器的时间,那么它会保存在内存中,直到最大时间,关闭浏览器之后还是能访问)
cookie.setMaxAge(多少秒)
Cookie和Session的对比:(Cookie不安全)
1、两者都可以进行数据的存储和传输
2、session存储在服务器内存中,可以存储对象
3、Cookie通过响应存储在浏览器中,主要是存储字符串
session的数据存储是依赖于Cookie的,session的唯一标识是使用Cookie存储的JSESSIONID,每次浏览器客户端进行请求的时候,会通过Cookie将session的id带给服务器,服务器通过当前的请求拿到JSESSIONID从而找到对应的session对象
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置一个字符串存储在session中
HttpSession session = request.getSession();
session.setAttribute("name","zhangsan");
//获取session对象的id
String session_id = session.getId();
//将session_id存储在Cookie中
Cookie cookie = new Cookie("JSESSIONID",session_id);
cookie.setMaxAge(300);
response.addCookie(cookie);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取会话
HttpSession session = request.getSession();
//通过会话获取属性值
String name = (String) session.getAttribute("name");
System.out.println(name);
}
Cookie的应用场景
记住密码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>实现记住密码</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/remember" method="post">
<input type="text" name="username" placeholder="请输入用户名" value="${cookie.username.value}">
<br>
<input type="password" name="password" placeholder="请输入密码" value="${cookie.password.value}">
<br>
<input type="checkbox" name="remember" value="1">记住密码
<input type="submit" value="登录">
</form>
</body>
</html>
通过浏览器的请求获取对应的remember的值是否记住密码
@WebServlet("/remember")
public class RememberCookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
String remember = request.getParameter("remember");
if(remember.equals("1")){
Cookie cookie=new Cookie("username",username);
Cookie cookie1=new Cookie("password",password);
cookie.setMaxAge(60*60*24*7);//保存7天
cookie1.setMaxAge(60*60*24*7);
response.addCookie(cookie);
response.addCookie(cookie1);
}
response.sendRedirect(request.getContextPath()+"/index.jsp");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Session
session表示的是当前的会话,默认其对象的生命周期为30分钟,当存在一个请求的时候默认会创建一个与之关联的session,会话对象唯一的标识为JSESSIONID通过Cookie进行传递
一旦浏览器关闭重新打开,此时服务器默认当做一个新的会话,会给一个新的JSESSIONID给浏览器客户端,覆盖原来的JSESSIONID(那么原有的对应的session对象的属性也会随之丢失
)
session的API
@WebServlet("/sessionTest1")
public class SessionDemoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
//表示设置session的存活时间单位为秒,默认为30分钟
session.setMaxInactiveInterval(60*30);
System.out.println("session id:"+session.getId());
session.setAttribute("name","zhangsan");
session.setAttribute("age",18);
String name = (String) session.getAttribute("name");
System.out.println("name:"+name);
Integer age = (Integer) session.getAttribute("age");
System.out.println("age:"+age);
//让session失效
session.invalidate();
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
通过Session实现图片验证码校验
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//获取输入框中的验证码
String captcha_code = request.getParameter("captcha");
//获取session中存储的验证码
HttpSession session = request.getSession();
String session_code = (String) session.getAttribute("captcha_code");
if (session_code.equalsIgnoreCase(captcha_code)){
//验证码正确
//获取用户名,密码
String username = request.getParameter("username");
String password = request.getParameter("password");
if (username.equals("admin") && password.equals("123456")){
//登录成功
//重定向跳转到登录成功页面
response.sendRedirect(request.getContextPath()+"/index.jsp");
}else {
//登录失败
//重定向跳转到登录页面
session.setAttribute("login_error","用户名或密码错误");
response.sendRedirect(request.getContextPath()+"/login.jsp");
}
}else {
//验证码错误
//重定向跳转到登录页面
session.setAttribute("login_error","验证码错误");
response.sendRedirect(request.getContextPath()+"/login.jsp");
}
}
//TODO:生成图片验证码并响应给前端
@WebServlet("/captchacode")
public class CaptchaServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO:获取图片验证码的对象
LineCaptcha lineCaptcha=new LineCaptcha(200,100,4,6);
//获取图片验证码
String code = lineCaptcha.getCode();
//获取session对象
HttpSession session = request.getSession();
//将图片验证码存入session中
session.setAttribute("captcha_code",code);
//设置响应的类型
response.setContentType("image/png");
//将图片验证码输出到客户端
lineCaptcha.write(response.getOutputStream());
response.getOutputStream().close();
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<div>
<h1 style="color: red;">${login_error}</h1>
<form action="${pageContext.request.contextPath}/login" method="post">
用户名:<input type="text" name="username" placeholder="请输入用户名">
<br>
密码:<input type="password" name="password" placeholder="请输入密码">
<br>
验证码:<input type="text" name="captcha" placeholder="请输入验证码">
<%--TODO:这个地方使用'?time='+new Date().getTime()是为了每一次请求都是不一样的--%>
<img src="${pageContext.request.contextPath}/captchacode" alt="图片验证码" width="40" height="30" onclick="this.src='${pageContext.request.contextPath}/captchacode?time='+new Date().getTime()">
</input>
<br>
<input type="submit" value="登录">
</form>
</div>
</body>
</html>