Web开发之Cookie and Session
会话
什么是会话?
简单说:用户开一个浏览器,点击多个超链接,访问服务器的多个web资源,然后关闭浏览器,整个过程就称之为一个会话。
会话过程要解决什么问题
- 每个用户在使用浏览器与服务器进行会话的过程中,都会产生一些数据,程序要想办法为每个用户保存这些数据
- 例如:用户点击超链接通过一个servlet购买了一个商品,程序应该想办法保存用户购买的商品,以便用户点结账servlet时,结账servlet可以得到用户购买的商品为用户结账。
Cookie
Cookie的属性
- name:Cookie的名字
- value:Cookie的值
- path:Cookie的存储路径,默认是访问的Servlet所在路径(可选)
- MaxAge:最大的存活时间,默认是存放在缓存区中的,生命周期就是一个会话(可选)
- version:Cookie的版本
- domain:域名(哪个网站)
- Comment:备注
Cookie的相关用法
程序为:记录上次访问的时间
ServletCookie1中
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter(); out.write("您上次访问的时间是:");
//拿到客户端携带的记录上次访问时间的Cookie:假设Cookie的名字是lastaccesstime,值是一个long类型的值
//拿到客户端携带的所有的Cookie
Cookie[] cs = request.getCookies();
//循环判断拿到需要的Cookie
for (int i=0; cs!=null && i<cs.length; i++){
Cookie c = cs[i];
if(c.getName().equals("lastaccesstime")){
//说明找到了需要的Cookie
String time = c.getValue();
//将time转化为long类型的值
long t = Long.parseLong(time);
//格式化为我们需要的格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//创建一个date对象
Date d = new Date(t);
//将数据输出到页面
out.write(sdf.format(d) + "
<a href = 'request.getContextPath()+"/servlet/ServletCookie2"'>清除Cookie</a>");
}
//向客户端发送Cookie
Cookie c = new Cookie("lastaccesstime", new Date().getTime() + ""); //设置Cookie的存活时间
//(只要设置了此时间,此Cookie就将存储到客户端的硬盘上,不会在缓存中存储)
c.setMaxAge(Integer.MAX_VALUE); //设置浏览器携带Cookie的路径
c.setPath(request.getContextPath()); //设置路径如果是/,意味着访问服务器上的任意工程资源都会携带此Cookie
//c.setPath("/"); //此路径是服务器的根路径:协议+主机名+端口号 //发送到客户端
response.addCookie(c);
}
ServletCookie2中(删除存储的Cookie)
//sun公司没有提供相应的方法
//所以创建一个同名的cookie,将存活时间设置为0即可,然后覆盖客户端存储的cookie
Cookie c = new Cookie("lastaccesstime","");
c.setMaxAge(0); //设置路径
c.setPath(request.getContextPath()); //发送到客户端
response.addCookie(c);
ServletCookie3(演示path的含义)
path的含义:默认情况下,客户端存储的Cookie的路径就是发送Cookie的Servlet的路径
//拿到客户端所有的Cookie
Cookies[] cs = request.getCookies();
//拿到记录上次访问时间的Cookies
for(int i=0; cs!=null && i<cs.length; i++) {
Cookie c = cs[i];
if(c.getName().equals("lastaccesstime")){
String value = c.getValue();
out.write(value);
}
}
Cookie应用:记住用户名密码
ServletUI中:
创建一个登录页面
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter(); //拿到错误信息
String error = (String)request.getAttribute("error");
if(error != null)
out.write("<font color = red>" +error+ "</font>"); String username="";
String pass = ""; //拿到客户端携带的所有Cookie
Cookie[] cs = request.getCookies();
//循环判断
for(int i=0; cs!=null && i<cs.length; i++){
Cookie c = cs[i];
if(c.getName().equals("name")){
//说明找到了存储用户名的cookie
username = c.getValue();
}
if(c.getName().equals("pass"))
//说明找到了存储密码的cookie
pass = c.getValue();
} //创建登录页面
out.write("<form action = '" + request.getContextPath() +
"/servlet/LoginServlet"' method = 'post'>");
out.write("姓名:<input type = 'text' name = 'username' value = '"+ username + "'><br>");
out.write("密码:<input type = 'text' name = 'password' value = '"+ pass + "'><br>");
out.write("<input type = 'checkbox'
name = 'remember' value = 'on'>记住用户名及密码两周<br>");
out.write("<input type = 'submit' value = '登录'><br>");
LoginServlet中:
1.判断用户是否是合法用户
2.看用户是否选择了记录用户名和密码
//拿取浏览器传递的数据
String name = request.getParameter("username");
String pass = request.getParameter("password");
String remember = request.getParameter("remember"); //判断用户是否是合法用户:假定name和pass的依序一样就是合法
//拿到密码的逆序
String pass1 = new StringBuffer(pass).reverse().toString(); //判断
if(name.equals(pass1)){
//表示合法 Cookie c = new Cookie("name",name);
Cookie c1 = new Cookie("pass",pass); //判断用户是否选择了记住用户名和密码
if("on".equals(remember)){
//说明用户选择了记录 //设定存储到客户端的硬盘上
c.setMaxAge(Integer.MAX_VALUE);
c1.setMaxAge(Integer.MAX_VALUE);
}else{
//设定客户端存储的用户名和密码立刻失效
c.setMaxAge(0);
c1.setMaxAge(0);
}
//设定访问路径
c.setPath(request.getContextPath());
c1.setPath(request.getContextPath()); //向客户端发送Cookie
response.addCookie(c);
response.addCookie(c1); request.setAttribute("name", name);
request.getRequestDispatcher("MainServlet").forward(request, response);
}else{
//非法用户
request.setAttribute("error", "用户名或密码错误");
request.getRequestDispatcher("ServletUI").forward(request,response);
}
MainServlet中:
String name = (String)request.getAttribute("name"); out.write(name + "欢迎你");
Session(也是域对象)
在Web开发中,服务器为每个用户创建一个会话对象(session对象),即一个浏览器独占一个session对象(默认)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
创建session
Servlet1
1.看客户端是否携带了JSESSIONIDCookie
2.如果没有携带,创建一个新的session对象,并分配一个唯一的id,发送到客户端,存储在客户端的缓存中;
如果携带了,将根据cookie的值(id)到服务器的内存中寻找session,如果找到了则返回此session为客户端服务,如果找不到,则创建新的session对象,并分配一个唯一的id,发送到客户端,存储在客户端的缓存中
HttpSession session = request.getSesstion();
String id = session.getId();
System.out.println("id:" + id);
session.setAttribute("name", "Tryking");
Servlet2
如果先访问1,不关浏览器再访问2。则两个id的值是一样的
HttpSession session = request.getSession();
String id = session.getId();
System.out.println("id:" + id);
String name = (String)session.getAttribute("name");
Web开发之Cookie and Session的更多相关文章
- web开发之Cookie使用
做过web开发的小伙伴对于Cookie一定不陌生,当用户登录后将用户的账号保存到本地,密码保存时,建议使用MD5进行加密,以防止用户个人信息的泄露.今天和大家简单聊聊关于Jquer Cookie的使用 ...
- Vim下的Web开发之html,CSS,javascript插件
Vim下的Web开发之html,CSS,javascript插件 HTML 下载HTML.zip 解压HTML.zip,然后将里面的所有文件copy到C:\Program Files\Vim\vi ...
- Web开发之Tomcat&Servlet
<!doctype html>01 - JavaEE - Tomcat&Servlet figure:first-child { margin-top: -20px; } #wri ...
- 移动web开发之rem适配布局
移动web开发之rem适配布局 方案: 页面布局文字能否随着屏幕大小变化而变化 流式布局和flex布局主要针对于宽度布局,那高度如何布局? 怎样让屏幕发生变化的时候元素高度和宽度等比例缩放? 1. r ...
- Java web 会话技术 cookie与session
一.会话 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 会话过程中要解决的一些问题 每个用户在使用浏览器与服务器进行会话的过程 ...
- web存储中cookie、session区别
http协议是一种无状态的协议,浏览器对服务器的每一次请求都是独立的.为了使得web能够产生一些动态信息,就需要保存”状态”,而cookie和session机制就是为了解决http协议无状态而产生.c ...
- web.py之cookie和session
官方给的session例子这里就不讲了.下面直接将怎么设置session,取session: session相关代码一定要放在web.py框架的Main.py里面. # Main.py # 设置ses ...
- Python Web开发之Flask
PythonWEB框架之Flask 前言: Django:1个重武器,包含了web开发中常用的功能.组件的框架:(ORM.Session.Form.Admin.分页.中间件.信号.缓存.ContenT ...
- Web 开发之 HTTP/2 & SPDY & HTTP 1.1 & HTTP 对比分析详解!
1 https://zh.wikipedia.org/wiki/HTTP/2 HTTP/2 维基百科,自由的百科全书 HTTP/2(超文本传输协议第2版 ...
随机推荐
- 【大咖直播】Elastic 企业搜索实战工作坊(第二期)
借助 App Search 提供的内置功能,您可轻松打造卓越的搜索体验.直观的相关度调整以及开箱即用的搜索分析,不仅可以优化所提供的内容,其提供的 API 还可帮助您将位于各处的所有内容源关联在一起. ...
- java 编程基础:【注解】 提取注解信息,利用自定义注解编写测试类,注解绑定事件
提取注解信息 使用注解修饰了类.方法.成员变量等成员之后,这些注解不会自己生效,必须由开发者提供相应工具来提取并处理注解信息. Java使用java.lang.annotation.Annotat ...
- 总结Vue第一天:简单介绍、基本常用知识、辅助函数
总结Vue第一天:简单介绍.基本常用知识.辅助函数 中文官网:https://cn.vuejs.org/v2/guide/syntax.html 遇到不熟悉的可以先看一下官网,然后再看一下一些别人写的 ...
- JAVA从字符串中提取纯数字
/** * 从字符串中提取纯数字 * @param str * @return */ public static String getNumeric(String str) { String regE ...
- 【九度OJ】题目1124:Digital Roots 解题报告
[九度OJ]题目1124:Digital Roots 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1124 题目描述: T ...
- 【LeetCode】787. Cheapest Flights Within K Stops 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:DFS 方法二:BFS 参考资料 日期 题目 ...
- 【LeetCode】62. Unique Paths 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/unique-pa ...
- 一、golang以及vscode的安装和配置
1.golang的下载安装 golang的官网最近好像整合了内容,统一到了一个地址:https://go.dev/ 首页直接点击download,下载自己对应的版本即可. 安装是傻瓜式的,一般默认安装 ...
- 分布式系统(二)——GFS
分布式存储系统的难点 在存储系统中,为了获得巨大的性能加成,一个很自然的想法就是采用分片(sharding),将数据分割存储到多台服务器上,这样获得了更大的存储容量,而且可以并行地从多台服务器读取数据 ...
- MySQL定时备份数据库方案
MySQL数据备份 1.备份全部数据库的数据和结构 mysqldump -uroot -p123456 -A > /data/mysqlDump/mydb.sql 2.备份全部数据库的结构(加 ...