网站平台建设公司,搜狗seo怎么做,温州专业网站托管,网站空间和数据库的关系文章目录 Cookie和Session#xff08;会话技术#xff09;一、Cookie1、Cookie概述1.1、Cookie简介1.2、Cookie的使用场景1.3、Cookie底层原理 2、Cookie的基本使用3、Cookie实现显示用户上次访问时间4、Cookie编码与解码5、Cookie总结 二、Session1、Session概述1.1、Sessio… 文章目录 Cookie和Session会话技术一、Cookie1、Cookie概述1.1、Cookie简介1.2、Cookie的使用场景1.3、Cookie底层原理 2、Cookie的基本使用3、Cookie实现显示用户上次访问时间4、Cookie编码与解码5、Cookie总结 二、Session1、Session概述1.1、Session简介1.2、Session的使用场景1.3、Session的底层原理 2、Session的基本使用3、Session的登录案例4、Session的购物案例5、Session总结 三、Session和Cookie的区别 Cookie和Session会话技术
一、Cookie
1、Cookie概述
1.1、Cookie简介
将会话过程中的数据保存到用户的浏览器中。服务端给客户端一个 信件客户端下次访问服务端带上 信件 就可以了。客户端技术响应请求用户打开一个浏览器点击了很多超链接访问多个web资源关闭浏览器这个过程可以称之为会话Cookie。一个Cookie只能保存一个信息。一个web站点可以给浏览器发送多个cookie最多存放20个cookie。Cookie大小有限制4kb。300个cookie浏览器上限。一次会话中可以包含多次请求和响应。
1.2、Cookie的使用场景
常用来判断是否第一次登录如果是你下次不用再登录了第二次访问直接就上去了
1.3、Cookie底层原理 2、Cookie的基本使用
Cookie(name,value)Cookie的构造方法以键值对的形式存放addCookie(cookie)添加CookiegetCookies()获取请求发送时的Cookie对象的数组getName()获取Cookie名称(键)getValue()获取Cookie的值setMaxAge(int expiry)设置Cookie的有效期秒为单位默认为-1永久存活(但是会在浏览器关闭时被删除)0为删除
RegistServlet.java
WebServlet(name RegistServlet, value /registServlet)
public class RegistServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding(utf-8);response.setContentType(text/html;charsetUTF-8);// 获取前端传来的参数String username request.getParameter(username);String password request.getParameter(password);// 判断输入的账号和密码是否正确if (username.equals(root) password.equals(111)){// 创建Cookie对象键值对形式存放Cookie cookie1 new Cookie(username, username);Cookie cookie2 new Cookie(password, password);// 设置cookie的存活时间cookie2.setMaxAge(10); // 以秒为单位默认为-1永久存活(但是会在浏览器关闭时被删除)0为删除// 在响应时添加cookieresponse.addCookie(cookie1);response.addCookie(cookie2);}}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}regist.jsp
% page importjava.util.Arrays %
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitle注册/title
/head
body
%--编写 jsp 小脚本--%
%// getCookies()获取请求发送时的Cookie对象的数组Cookie[] cookies request.getCookies();// 定义变量用于value的显示String username , password ;// 判断获取来的cookie是否为空不为空执行if (cookies ! null) {// 遍历cookie数组里的数据for (Cookie cookie : cookies) {/* System.out.println(cookie.getName());System.out.println(cookie.getValue());*/// getName()获取Cookie名称(键)等于前端传来的username的值if (cookie.getName().equals(username)) {// getValue()获取Cookie的值将值赋给变量username用于后面value的显示username cookie.getValue();}if (cookie.getName().equals(password)) {password cookie.getValue();}}}
%form actionregistServlet methodpost%-- 变量名JSP中的语法获取变量的值显示到前端 --%用户名input typetext nameusername value%username% br密码input typepassword namepassword value%password% brinput typesubmit value提交
/form
/body
/html3、Cookie实现显示用户上次访问时间
LastServlet.java WebServlet(name LastServlet, value /LastServlet)
public class LastServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding(utf-8);response.setContentType(text/html;charsetUTF-8);Cookie[] cookies request.getCookies(); // 获取所有cookieboolean flag false; // 判断cookies是否为空// 访问过cookies中会有时间if (cookies.length 0 cookies ! null) { //遍历cookie数组for (Cookie cookie : cookies) {String name cookie.getName();// 判断名称是否是lastTimeif (lastTime.equals(name)) {// 有该cookie不是第一次访问flag true; // 响应数据与解码String value cookie.getValue();value URLDecoder.decode(value, utf-8);response.getWriter().write(欢迎回来您上次访问的时间为 value);cookie.setMaxAge(60 * 60 * 24 * 30);response.addCookie(cookie);break;}}if (cookies null || cookies.length 0 || flag false) {// 获取系统时间与编码String str_date new SimpleDateFormat(yyyy年MM月dd日 HH:mm:ss).format(new Date());str_date URLEncoder.encode(str_date, utf-8);// 设置cookie的valueCookie cookie new Cookie(lastTime, str_date);cookie.setMaxAge(60 * 60 * 24 * 30);response.addCookie(cookie);response.getWriter().write(您好欢迎您首次访问);}}}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
4、Cookie编码与解码
由于Cookie不支持中文我们需要进行编码与解码。
URLEncoder.encode(沈公子,utf-8); // 编码
URLDecoder.decode(cookie.getValue(),utf-8); // 解码5、Cookie总结
cookie作用 cookie判断用户是否第一次登录如果是第一次则需要登录第二次之后则直接访问 cookie有效期 setMaxAge(); 不设置有效期关闭浏览器cookie将被删除有效期设置为0删除cookie设置有效期过期后cookie才会被删除 cookie如何保存 一个cookie只能保存一个信息cookie由浏览器保存
二、Session
1、Session概述
1.1、Session简介
Session对象由服务器保存。Session是一种会话跟踪技术。Session是基于Cookie实现的。服务器登记你来过了下次你来的时候我来匹配你。保存信息通过SessionID访问SessionID浏览器一打开就会存在。服务器会给每一个用户浏览器创建一个Session对象。一个Session独占一个浏览器只要浏览器没有关闭这个Session就存在。用户登录之后整个网站它都可以访问保存用户的信息保存购物车的信息。同一次会话的多次请求间共享数据。 10.服务器关闭后Tomcat会自动将Seesion数据写入硬盘文件中再次启动服务器后从文件中加载数据到Session中。
1.2、Session的使用场景
保存一个登录用户的信息购物车信息在整个网站中经常会使用的数据我们将它保存在Session中
1.3、Session的底层原理 2、Session的基本使用
getSession()获取SessionsetAttribute()给session设置键值对数据getAttribute()通过键获取session中的值removeAttribute()通过键移除session中的值getId()获取session的idinvalidate()session失效再次进入会重置Session的值web.xml配置Session的失效时间
!-- 设置Session默认的失效时间 --
session-config!-- 1分钟后Session自动失效再次进入会重置Session的值以分钟为单位 --session-timeout1/session-timeout
/session-config测试1
WebServlet(name SessionDemo01, value /SessionDemo01)
public class SessionDemo01 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding(utf-8);response.setContentType(text/html;charsetUTF-8);// 获取sessionHttpSession session request.getSession();// 给session设置键值对数据session.setAttribute(name, 沈公子222);// 获取session的id (JSESSIONIDD2EBCA814B8FC3249BCA47C96374A2F8)String sessionId session.getId();// 判断session是否已存在if (session.isNew()) {response.getWriter().write(session创建成功ID sessionId);} else {response.getWriter().write(session已经在服务器中存在ID sessionId);}// Session创建的时候做了什么事情在响应中显示Cookie的值Cookie cookie new Cookie(JSESSIONID, sessionId);response.addCookie(cookie);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}测试2
WebServlet(name SessionDemo02, value /SessionDemo02)
public class SessionDemo02 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding(utf-8);response.setContentType(text/html;charsetUTF-8);// 获取sessionHttpSession session request.getSession();// 通过键获取session中的值Object name session.getAttribute(name);response.getWriter().print(name);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}测试3
WebServlet(name SessionDemo03, value /SessionDemo03)
public class SessionDemo03 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding(utf-8);response.setContentType(text/html;charsetUTF-8);// 获取sessionHttpSession session request.getSession();// 通过键移除session中的值session.removeAttribute(name);// session失效再次进入会重置Session的值session.invalidate();}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}3、Session的登录案例
login.html
!DOCTYPE html
html langen
headmeta charsetUTF-8title登录/title
/head
bodyform actionLoginServlet methodpost用户名: input typetext nameusernamebr/密码 input typepassword namepasswordbr/input typesubmit value提交
/form/body
/htmlUser.java
public class User {private String username;private String password;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;}
}LoginServlet.java
WebServlet(name LoginServlet, value /LoginServlet)
public class LoginServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding(utf-8);response.setContentType(text/html;charsetUTF-8);PrintWriter out response.getWriter();String username request.getParameter(username);String password request.getParameter(password);if ((root).equals(username) (123123).equals(password)) {User user new User();user.setUsername(username);user.setPassword(password);// 请求时获取Session并将数据绑定进来request.getSession().setAttribute(user, user);response.sendRedirect(request.getContextPath() /IndexServlet); // /demo06_3/IndexServlet} else {out.print(用户名或密码错误登录失败请重新登录a href/demo06_3/login.html返回登录/a);}}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}IndexServlet.java
WebServlet(name IndexServlet, value /IndexServlet)
public class IndexServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding(utf-8);response.setContentType(text/html;charsetUTF-8);PrintWriter out response.getWriter();// 创建或者获取保存用户信息的Session对象HttpSession session request.getSession();// 获取传递的数据User user (User) request.getSession().getAttribute(user);if (user null) {out.print(您还没有登录请a href/demo06_3/login.html登录/a);} else {out.print(您已登录欢迎你 user.getUsername() !);out.print(a href/demo06_3/LogoutServlet退出/a);// 创建Cookie存放Session的标识号Cookie cookie new Cookie(JSESSIONID, session.getId());cookie.setMaxAge(60*30); // 30分钟session过期需要重新登录// 设置Cookie的有效目录路径cookie.setPath(request.getContextPath()); // /demo06_3response.addCookie(cookie);// Set-Cookie: JSESSIONID315710819A1A3518B0CCDCDC061BBD64; Max-Age60; ExpiresWed, 22 Mar 2023 03:24:40 GMT; Path/demo06_3}}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}LogoutServlet.java
WebServlet(name LogoutServlet, value /LogoutServlet)
public class LogoutServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding(utf-8);response.setContentType(text/html;charsetUTF-8);// 获取Session时将Session对象中的User对象移除并不是把Session的标识号给移除request.getSession().removeAttribute(user);response.sendRedirect(request.getContextPath()/IndexServlet);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}4、Session的购物案例
Cake.java
public class Cake {private String id;private String name;public Cake() {}public Cake(String id, String name) {this.id id;this.name name;}public String getId() {return id;}public void setId(String id) {this.id id;}public String getName() {return name;}public void setName(String name) {this.name name;}
}CakeDB.java
public class CakeDB {private static MapString,Cake cake new LinkedHashMap();static {cake.put(1,new Cake(1,A类蛋糕));cake.put(2,new Cake(2,B类蛋糕));cake.put(3,new Cake(3,C类蛋糕));cake.put(4,new Cake(4,D类蛋糕));cake.put(5,new Cake(5,E类蛋糕));}// 获取所有的蛋糕public static CollectionCake getAll(){return cake.values();}// 根据指定的id获取蛋糕public static Cake getCake(String id){return cake.get(id);}
}ListCakeServlet.java
WebServlet(name ListCakeServlet, value /ListCakeServlet)
public class ListCakeServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding(utf-8);response.setContentType(text/html;charsetUTF-8);PrintWriter out response.getWriter();// 获取所有蛋糕CollectionCake cakes CakeDB.getAll();out.write(本站提供的蛋糕有br);// 遍历输出所有蛋糕for (Cake cake : cakes) {// 获取蛋糕的idString url PurchaseServlet?id cake.getId();// 获取蛋糕的名字和id并跳转到 PurchaseServletout.write(cake.getName() a href url 点击购买/abr);}}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}PurchaseServlet.java
WebServlet(name PurchaseServlet, value /PurchaseServlet)
public class PurchaseServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding(utf-8);response.setContentType(text/html;charsetUTF-8);// 这个 Servlet 起到中转的作用用来判断是否购买蛋糕根据情况来重定向String id request.getParameter(id);// 如果id为空将重定向到 ListCakeServletif (id null) {response.sendRedirect(ListCakeServlet);return;}Cake cake CakeDB.getCake(id); // 根据id获取蛋糕HttpSession session request.getSession(); // 获取sessionListCake cart (ListCake) session.getAttribute(cart); // 通过键获取session里的值// 如果session中的键的值为空就创建列表设置session数据if (cart null) {cart new ArrayList();session.setAttribute(cart, cart);}cart.add(cake); // 不等于空添加数据// session的设置Cookie cookie new Cookie(JSESSIONID, session.getId());cookie.setMaxAge(60 * 30);cookie.setPath(/Servlet);response.addCookie(cookie);response.sendRedirect(CartServlet); // 有蛋糕会重定向 CarServlet}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}CartServlet.java
WebServlet(name CartServlet, value /CartServlet)
public class CartServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding(utf-8);response.setContentType(text/html;charsetUTF-8);PrintWriter out response.getWriter();ListCake cart null;boolean purFlag true; // 定义标识HttpSession session request.getSession(false);// 如果session为空标识为假if (session null) {purFlag false;} else { // session不为空// 通过键获取session里的值cart (ListCake) session.getAttribute(cart);// 如果session中的键的值为空标识为假if (cart null) {purFlag false;}}// 如果标识为假if (!purFlag) {out.write(对不起您还没有购买任何商品br);}else { // 否则标识为真out.write(您购买的蛋糕有br);// 遍历输出蛋糕名称for (Cake cake : cart) {out.write(cake.getName()br);}}}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}5、Session总结
Session的作用 保存用户信息购物车信息等 Session的有效期 SessionID浏览器一打开就会存在关闭浏览器SeesionID会失效可以配置Session失效时间 Session如何保存 Session由服务器保存数据Session可以保存和获取数据
三、Session和Cookie的区别
相同
Cookie和Session都是来完成一次会话多次请求间数据共享的。
不同
存储位置Cookie存储在客户端Session存储到服务端安全性Cookie不安全Session安全数据大小Cookie最大3KBSession无大小限制存储时间Cookie可以长期存储Session默认30分钟服务器性能Cookie不占用服务器资源Session占用服务器资源