信息网站设计案例济宁网站

当前位置: 首页 > news >正文

信息网站设计案例,济宁网站,贵阳网站开发人员工资,wordpress文章导入 id深入理解Cookie与Session#xff1a;实现用户跟踪和数据存储 今日目标 1.掌握客户端会话跟踪技术Cookie 2.掌握服务端会话跟踪技术Sesssion 1.会话跟踪技术介绍 会话#xff1a;用户打开浏览器#xff0c;访问web服务器的资源#xff0c;会话建立#xff0c;直到有一方断…深入理解Cookie与Session实现用户跟踪和数据存储 今日目标 1.掌握客户端会话跟踪技术Cookie 2.掌握服务端会话跟踪技术Sesssion 1.会话跟踪技术介绍 会话用户打开浏览器访问web服务器的资源会话建立直到有一方断开连接会话结束。一次会话中可以包含多次请求和响应. HTTP协议是无状态协议每次同一浏览器向服务器请求时服务器都会将该请求视为新的请求因此我们需要会话跟踪技术来实现同一会话内数据共享 思考:下图建立几个会话? 每个浏览器都会与服务端建立了一个会话加起来总共是3个会话。 思考:服务器如何识别多次请求是否来自于同一浏览器? 这就需要我们学习今天的内容会话跟踪技术。 会话跟踪一种维护浏览器状态的方法服务器需要识别多次请求是否来自于同一浏览器以便在同一次会话的多次请求间共享数据 原因:HTTP协议是无状态的每次浏览器向服务器请求时服务器都会将该请求视为新的请求因此我们需要会话跟踪技术来实现会话内数据共享 思考:一个会话中的多次请求为什么要共享数据呢?有了这个数据共享功能后能实现哪些功能呢? 购物车功能: 加入购物车和去购物车结算是两次请求但是后面这次请求要想展示前一次请求所添加的商品就需要用到数据共享。 记住我功能:当用户登录成功后勾选记住我按钮后下次再登录的时候网站就会自动填充用户名和密码简化用户的登录操作多次登录就会有多次请求他们之间也涉及到共享数据 实现方式 客户端会话跟踪技术Cookie 服务端会话跟踪技术Session
2.Cookie基本使用 Cookie客户端会话跟踪技术将数据保存到客户端以后每次请求都携带Cookie数据进行访问 2.1基本使用 2.1.1 发送Cookie 创建Cookie对象设置数据
Cookie cookie  new Cookie(key,value);发送Cookie到客户端使用response对象
response.addCookie(cookie);2.1.2获取Cookie 获取客户端携带的所有Cookie使用request对象
Cookie[] cookies  request.getCookies();遍历数组获取每一个Cookie对象for 使用Cookie对象方法获取数据
cookie.getName(); cookie.getValue();2.2代码实现 创建08_Cookie_Session的Maven Web项目,并添加Servlet依赖在Pom.xml中 dependenciesdependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion4.0.1/versionscopeprovided/scope/dependency/dependenciesCookie[] cookies  request.getCookies();创建AServlet用于发送Cookie到浏览器
package com.zbbmeta.cookie; import javax.servlet.; import javax.servlet.http.; import javax.servlet.annotation.*; import java.io.IOException; /* 发送Cookie*/ WebServlet(value  /a) public class Aservlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求//1.创建cookie对象Cookie cookie  new Cookie(name,lisi);//2.发送cookie对象到浏览器response.addCookie(cookie);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);} }创建BServlet用于获取Cookie数据
package com.zbbmeta.cookie; 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.io.PrintWriter;/
 获取Cookie/ WebServlet(value  /b) public class Bservlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求//3.获取客户端携带的所有Cookie使用request对象Cookie[] cookies  request.getCookies();response.setContentType(text/html;charsetutf-8);PrintWriter writer  response.getWriter();if(cookies!null){//4.遍历数组获取每一个Cookie对象forfor (Cookie cookie : cookies) {//5.使用Cookie对象方法获取数据String name  cookie.getName();String value  cookie.getValue();writer.write(name  valuebr);}}else {writer.write(cookie不存在br);}}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);} }在浏览器中先访问地址:http://localhost:8080/cookie-session/a然后在访问http://localhost:8080/cookie-session/b查看浏览器结果如图所示: 3Cookie原理 Cookie的实现是基于HTTP协议的 响应头set-cookie 请求头cookie 在浏览器 查看Cookie 3.Cookie使用细节 3.1Cookie 存活时间 默认情况下Cookie 存储在浏览器内存中当浏览器关闭内存释放则Cookie被销毁 setMaxAge(int seconds)设置Cookie存活时间但是是秒 负数默认值Cookie在当前浏览器内存中当浏览器关闭则 Cookie被销毁 正数将 Cookie写入浏览器所在电脑的硬盘持久化存储。到时间自动删除 零立即过期步骤和结果和正数步骤一致这里就不掩饰了 完整代码: AServlet
package com.zbbmeta.cookie; import javax.servlet.; import javax.servlet.http.; import javax.servlet.annotation.*; import java.io.IOException; /* 发送Cookie/ WebServlet(value  /a) public class Aservlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求//1.创建cookie对象Cookie cookie  new Cookie(name,lisi);//3. setMaxAge(int seconds)设置Cookie存活时间但是是秒cookie.setMaxAge(10); //        cookie.setMaxAge(-1);//cookie.setMaxAge(0);//2.发送cookie对象到浏览器response.addCookie(cookie);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);} }3.2Cookie 存储问题 如需要存储空格则需要进行转码URL编码 会出现问题 解决方法 在发送cookie端进行URL编码
URLEncoder.encode(name,UTF-8);在获取cookie端进行URL解码
value  URLDecoder.decode(name,UTF-8);浏览器显示结果 完整代码 AServlet
package com.zbbmeta.cookie; import javax.servlet.
; import javax.servlet.http.; import javax.servlet.annotation.; import java.io.IOException; import java.net.URLDecoder; import java.net.URLEncoder;/
 发送Cookie/ WebServlet(value  /a) public class Aservlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求//1.创建cookie对象String name   lisi;name  URLEncoder.encode(name,UTF-8);Cookie cookie  new Cookie(name,name);//3. setMaxAge(int seconds)设置Cookie存活时间但是是秒cookie.setMaxAge(10); //        cookie.setMaxAge(-1);//cookie.setMaxAge(0);//2.发送cookie对象到浏览器response.addCookie(cookie);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);} }BServlet
package com.zbbmeta.cookie; 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.io.PrintWriter; import java.net.URLDecoder;/* 获取Cookie/ WebServlet(value  /b) public class Bservlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求//3.获取客户端携带的所有Cookie使用request对象Cookie[] cookies  request.getCookies();response.setContentType(text/html;charsetutf-8);PrintWriter writer  response.getWriter();if(cookies!null){//4.遍历数组获取每一个Cookie对象forfor (Cookie cookie : cookies) {//5.使用Cookie对象方法获取数据String name  cookie.getName();String value  cookie.getValue();value  URLDecoder.decode(value,UTF-8);writer.write(name  |valuebr);}}else {writer.write(cookie不存在br);}}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);} }Tomcat7 Cookie 不能直接存储中文Tomcat8 Cookie可以存储中文但不能存储空格
4.Session基本使用 Session服务端会话跟踪技术将数据保存到服务端 4.1基本使用 4.1.1 获取Session JavaEE 提供 HttpSession接口来实现一次会话的多次请求间数据共享功能 使用 获取Session对象
HttpSession session  request.getSession();4.1.2 Session对象功能 Session对象功能 void setAttribute(String name, Object o//存储数据到 session 域中Object getAttribute(String name) //根据 key获取值void removeAttribute(String name) //根据 key删除该键值对4.2代码实现 创建CServlet用于存储数据到Session对象
package com.zbbmeta.session;import javax.servlet.
; import javax.servlet.http.; import javax.servlet.annotation.; import java.io.IOException; import java.io.PrintWriter;/
 1.存储Session数据到服务器/ WebServlet(value  /c) public class CServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求//1.获取Session对象HttpSession session  request.getSession();//2.存储数据到sessionsession.setAttribute(name,session_wangwu);response.setContentType(text/html;charsetutf-8);PrintWriter writer  response.getWriter();writer.write(访问了C资源br);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);} }创建DServlet用于从Session对象获取数据
package com.zbbmeta.session;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.io.IOException; import java.io.PrintWriter;/* 2.在Session对象中获取数据/ WebServlet(value  /d) public class DServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求//1.获取Session对象HttpSession session  request.getSession();//2.存储数据到sessionObject name  session.getAttribute(name);response.setContentType(text/html;charsetutf-8);PrintWriter writer  response.getWriter();writer.write(访问了D资源br);if(name!null){writer.write(name.toString()br);}else {writer.write(Session数据不存在br);}}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);} }在浏览器中先访问地址:http://localhost:8080/cookie-session/c然后在访问http://localhost:8080/cookie-session/d查看浏览器结果如图所示: 5.Session原理 Session基于Cookie实现 思考:如果新开一个浏览器还是同一个session对象么? 答案:上图显示的获取的Session对象不是一个每一个浏览器都会获取一个新的Session对象 判断Session对象是否是新对象代码 CServlet
package com.zbbmeta.session;import javax.servlet.
; import javax.servlet.http.; import javax.servlet.annotation.; import java.io.IOException; import java.io.PrintWriter;/
 1.存储Session数据到服务器/ WebServlet(value  /c) public class CServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求response.setContentType(text/html;charsetutf-8);PrintWriter writer  response.getWriter();//1.获取Session对象HttpSession session  request.getSession();//3.判断Session是否是新对象boolean aNew  session.isNew();//4.获取SessionIDString id  session.getId();writer.write(session 是新的 aNew session id : idbr);//2.存储数据到sessionsession.setAttribute(name,session_wangwu);writer.write(访问了C资源br);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);} }DServlet
package com.zbbmeta.session;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.io.IOException; import java.io.PrintWriter;/** 2.在Session对象中获取数据/ WebServlet(value  /d) public class DServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求response.setContentType(text/html;charsetutf-8);PrintWriter writer  response.getWriter();//1.获取Session对象HttpSession session  request.getSession();//3.判断Session是否是新对象boolean aNew  session.isNew();//4.获取SessionIDString id  session.getId();writer.write(session 是新的 aNew session id : idbr);//2.存储数据到sessionObject name  session.getAttribute(name);writer.write(访问了D资源br);if(name!null){writer.write(name.toString()br);}else {writer.write(Session数据不存在br);}}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);} }浏览器结果 6.Session使用细节 6.1.Session 钝化、活化 Session 钝化、活化 服务器重启后Session中的数据是否还在 钝化在服务器正常关闭后 Tomcat自动将 Session数据写入硬盘的文件中 活化再次启动服务器后从文件中加载数据到Session中
在IDEA中配置钝化 查看钝化数据 查看钝化数据的前台条件是我们已经有Session对象存储数据 1.我们现在的08_Cookie_Session项目启动的并且访问了c资源 2.关闭项目 3.根据路径查看session数据 4.发现有后缀为.ser的文件 5.重新启动.ser文件就不存在了(步骤五就是活化) 6.2.Seesion 销毁 6.2.1 默认情况下无操作30分钟自动销毁 获取存活时间方式 //5.获取存活时间int maxInactiveInterval  session.getMaxInactiveInterval();访问c浏览器结果 停留10s,访问d浏览器结果 思考为什么停留10s后session对象的存活时间还是1800s? 存活时间表示的是没有访问资源的情况下如果访问了则存活时间重新变为1800s. 6.2.2 web.xml配置存活时间 可以通过web.xml进行配置单位为分钟 ?xml version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsdversion4.0session-config !–  单位是分钟–session-timeout2/session-timeout/session-config /web-app调用 Session对象的 invalidate()方法
注意最好关闭浏览器再打开 6.1Cookie和Session的对比 相同点 Cookie 和 Session 都是来完成一次会话内多次请求间数据共享的 区别 键值对数量Cookie 存一个键和一个值Session 存n个键和值 存储位置Cookie 是将数据存储在客户端Session 将数据存储在服务端 安全性Cookie 不安全Session 安全 数据大小Cookie 最大4KBSession 无大小限制 存储时间Cookie默认浏览器关闭Session 默认30分钟 服务器性能Cookie 不占服务器资源Session 占用服务器资源