session和filter
会话
用户打开浏览器访问服务器资源,会话建立,直到有一方断开连接会话结束
一次会话中可以包含多次请求和响应
会话跟踪
一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据
cookie
跨浏览器不能访问,但是会话期结束还存在
是一种客户端会话技术,将数据保存到客户端,以后每次请求都携带cookie数据进行访问
cookie的使用
-
使用:
-
创建cookie对象,设置数据
-
发送cookie到客户端,使用response对象
-
-
获取:
-
获取客户端携带的所有cookie,使用request对象
-
遍历数组,获取每一个cookie对象
-
使用cookie对象方法获取数据
-
cookie使用的细节
-
存活时间
-
默认情况下cookie存储在浏览器内存中,当浏览器关闭,内存释放,则cookie销毁
-
setMaxAge 设置cookie在浏览器的过期时间
-
正数,持久化存储,到时间自动删除
-
负数:默认值,浏览器关闭cookie销毁
-
0:删除对应的cookie
-
-
-
cookie不能直接存储中文,如需要,则进行转码----URL编码
session
也不能跨浏览器访问,而且会话期结束就不存在,一种服务端会话跟踪技术:将数据保存到服务端
session使用
-
获取session对象
-
HttpSession session = request.getSession();
-
-
session对象功能
-
setAttribute 存储数据到session
-
getAttribute 根据key获取值
-
removeAttribute 根据key删除该键值对
-
session使用细节
-
session的实现原理是基于cookie的
-
钝化活化:
-
钝化:服务器正常关闭后,Tomcat自动将session数据写入硬盘文件
-
活化:再次启动服务后,从文件中加载数据到session中
-
-
销毁:
-
默认情况下,30分钟自动销毁,可以用下面的代码修改
-
<session-config>
-
<session-timeout>30</session-timeout>
-
</session-config>
-
或者调用invalidate()方法
-
cookie和session的区别
首先,cookie和session都是用来完成一次会话内多次请求间数据共享的
- 区别:
-
存储位置:cookie将数据存储在客户端,session将数据存储在服务端
-
安全性:cookie不安全,session安全
-
数据大小:cookie最大3kb,session无大小限制
-
存储时间:cookie可长期存储,session默认30分钟
-
服务器性能:cookie不占服务器资源,session占用服务器资源
-
实现登录功能
记住密码的逻辑
-
第一次点击记住密码,将用户名和密码放到cookie里面
-
第二次进行登录的时候,判断遍历cookies里面是否有这个值,
-
如果有,则直接将用户名取出来发往前端jsp
-
验证码原理
-
1.画一个图片
-
2.设置图片背景颜色
-
3.设置验证码的字符
-
4.将字符画进图片
-
5.设置干扰线
-
6.将验证码字符保存到session
-
7.输入验证码之后到session里面比较验证码是否正确,正确之后继续接下来的操作
实例
注册登录的servlet
package com.wanxi.servlet;
import com.wanxi.model.UserModel;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
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.BufferedReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Enumeration;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.乱码处理
req.setCharacterEncoding(StandardCharsets.UTF_8.toString());
resp.setCharacterEncoding(StandardCharsets.UTF_8.toString());
//2.获取前端的值
String username = req.getParameter("username");
String password = req.getParameter("password");
String remember = req.getParameter("remember");
String code = req.getParameter("code");
//3.封装对象
//4.逻辑处理
//判断验证码是否正确
if (code.equals(req.getSession().getAttribute("vCode"))){
//点击记住密码后,将信息存储
//如果remember是null,则没有equals方法,所以应该将字符串放在前面使用equals方法
if ("on"</