7、Servlet会话跟踪
一、会话跟踪:
不管操作多少功能,都是与当前登录用户相关的信息,当前的登录用户始终没有改变,也就是用户名和密码都没有丢失。但HTTP协议是一个无状态的协议,当一个客户向服务器发出请求(request),在服务器返回响应(response)后,连接就关闭了。这时,在服务器端不保留连接相关的信息,因此当下一次请求连接时,服务器已没有以前连接的信息了,也就无法判断这一次连接和以前的连接是否属于同一客户,也就是说Web服务器无法跟踪客户状态。在 Servlet 规范中,常用以下两种机制完成会话跟踪:
a)使用持续的Cookie
b)使用Session(会话)机制
二、Cookie:Cookie以“名-值”对的形式保存数据
1.创建Cookie对象: new Cookie(name,value);
2.设置最大时效 :setMaxAge(int age);
3.将Cookie放入到HTTP响应报头: addCookie(Cookie cookie);
【注意】如果创建了一个cookie,并将它发送到浏览器,默认情况下它是一个会话级别的cookie,他将被存储在浏览器的内存中,用户退出浏览器之后被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用setMaxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
1)、将数据写入Cookie中:
package com.st.user; import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @SuppressWarnings("serial")
public class UserLoginTest extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
req.setCharacterEncoding("UTF-8"); //post乱码专用解决方式
String userName = req.getParameter("userName");
String passWord = req.getParameter("passWord");
System.out.println(userName);
System.out.println(passWord);
Cookie cookieByName = new Cookie("userName",userName);
Cookie cookieByPassWord = new Cookie("passWord", passWord);
/*cookieByName.setMaxAge(24 * 60 * 60); //设置在硬盘上保存的时间,以秒为单位。
cookieByPassWord.setMaxAge(24 * 60 * 60);因为保存在硬盘上,所以即便是服务器重启了依然可以访问*/
resp.addCookie(cookieByName);
resp.addCookie(cookieByPassWord);
//转发
// req.getRequestDispatcher("/home.jsp").forward(req, resp);
//重定向
resp.sendRedirect("home.jsp");
}
}
2)、读取cookie中的值:
package com.st.user; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @SuppressWarnings("serial")
public class BookServletTest extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
System.out.println(request.getParameter("bookName"));
Cookie cookie []= request.getCookies(); //返回的是cookie的一个数组
for(Cookie c: cookie){
if("userName".equals(c.getName()))
System.out.println("userName="+c.getValue());
else if("passWord".equals(c.getName()))
System.out.println("password="+c.getValue());
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" This is ");
out.print(this.getClass());
out.println(", using the POST method");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
二、Session:Session机制采用的是在服务器端保持 HTTP 状态信息的方案。会话范围是某个用户从首次访问服务器开始,到该用户关闭浏览器结束。会话时效采用间隔计时的方式。
a)、写入Session:
package com.st.session; import java.io.IOException;
import java.util.HashMap;
import java.util.Map; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; public class UserLoginTest extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { } public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8"); //post乱码专用解决方式
String userName = request.getParameter("userName");
String passWord = request.getParameter("passWord");
System.out.println(userName);
System.out.println(passWord);
HttpSession session = request.getSession();//如果当前存在session,则使用已存在的session如果当前不存在session,则创建一个新的session
session.setAttribute("userName", userName);
session.setAttribute("passWord", passWord);
//session可以载入任意类型的值
Map<String, String> map =new HashMap<String, String>();
map.put("userName", userName);
map.put("passWord", passWord);
session.setAttribute("user", map);
session.setMaxInactiveInterval(60);//设置该Session的最大时效,以S为单位
System.out.println(request.getContextPath());
// request.getRequestDispatcher("/home.jsp").include(request, response);
response.sendRedirect("../home.jsp");
}
}
b)、读取session:
package com.st.session; import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; public class SessionTest extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { }
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8"); //post乱码专用解决方式
System.out.println(request.getParameter("bookName"));
HttpSession session = request.getSession();
System.out.println("session="+session); //如果session里没有对应的属性名,则返回null
String userName = (String)session.getAttribute("userName");
String passWord = (String)session.getAttribute("passWord");
System.out.println("userName="+userName+",passWord="+passWord); Map<String, String> map = (Map<String, String>)session.getAttribute("user");
System.out.println("The userName is "+map.get("userName")+",passWord = "+map.get("passWord"));
response.sendRedirect("../home.jsp");
} }
三、Cookie和Session的区别:
1、存放的位置不同:
a)、Cookie存放于客户端的临时文件夹中
b)、Session存放于服务器端,服务器为每个用户创建一个独立的Session域对象。
2、生命周期不同:
a)、如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。另外如果设置了Cookie的最大时效(比如设置一个小时),则从设置完成开始计时,当时间达到1个小时后,Cookie就自动失效了。
b)、Session的默认时效为20分钟(当然这个默认值也是可以自己设置的),其计时方式是间隔的,即从创建开始到20分钟后Session就会自动被销毁,但是如果在第19分59秒的时候访问了Session,那么这个生命周期又将从0开始计时,直到用户在连续的20分钟内都没有访问后Session才被销毁。
3、安全性不同:
a)、Cookie存放在客户端的临时文件夹中不安全
b)、Session存放在服务器的内存中,所以相对来说要安全得多
4、作用范围不同
a)、Cookie可以为多个用户浏览器共享
b)、Session只为同一个用户浏览想用
7、Servlet会话跟踪的更多相关文章
- 关于Servlet会话跟踪的那些事儿
关于servlet会话跟踪,一搜都能搜出很多.我也不免落入俗套,也总结了一把.希望我所总结的知识尽量是知识海洋里的一汪清泉.能帮助到我自己和哪怕一个人,那也是值得的. 故事由来: 我们知道,http协 ...
- Servlet - 会话跟踪
Servlet 标签 : Java与Web 会话跟踪 HTTP本身是"无状态"协议,它不保存连接交互信息,一次响应完成之后即连接断开,下一次请求需要重新建立连接,服务器不记录上次连 ...
- Servlet会话跟踪和Cookies及HttpSession会话
会话只是指一段指定的时间间隔. 会话跟踪是维护用户状态(数据)的一种方式.它也被称为servlet中的会话管理. Http协议是一个无状态的,所以我们需要使用会话跟踪技术来维护用户状态. 每次用户请求 ...
- IT兄弟连 JavaWeb教程 Servlet会话跟踪 Session常用方法
● public Object getAttribute(String name) 该方法返回在该session会话中具有指定名称的对象,如果没有指定名称的对象,则返回null. ● public ...
- IT兄弟连 JavaWeb教程 Servlet会话跟踪 Session技术
Servlet提供了HttpSession接口,该接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式. Servlet容器使用这个接口来创建一个HTTP客户端和HTTP服务器之 ...
- IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie常用方法
以下是在Servlet中操作Cookie时可使用的有用的方法列表 ● public void setDomain(String pattern) 该方法设置cookie适用的域,例如 itxdl.c ...
- IT兄弟连 JavaWeb教程 Servlet会话跟踪 经典面试题
1.描述Cookie的作用 Cookie是网站保存在浏览器客户端的信息,也就是说保存在访客的机器里的变量,一般随着HTTP头发送到客户端.在Cookie生效之后及失效之前,客户每次发出页面请求的时候, ...
- IT兄弟连 JavaWeb教程 Servlet会话跟踪 经典案例
案例需求:编写一个servlet,可以向session中存放一个消息,再编写一个servlet可以从session取得session中存放的这个消息. 案例实现: package com.xdl.se ...
- IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie路径问题
操作Cookie时,需要注意路径问题: 设置操作:任何路径都可以设置Cookie,但是有时我们也是用设置进行替换Cookie和删除Cookie(maxAge=0)! 替换:只能由完全相同的路径来操作! ...
随机推荐
- ubuntu创建idea桌面快捷方式
This method can be used to create a launcher for any application, not just IntelliJ IDEA. For any la ...
- TableExistsException: hbase:namespace
解决:zookeeper还保留着上一次的Hbase设置,所以造成了冲突.删除zookeeper信息,重启之后就没问题了 1.切换到zookeeper的bin目录: 2.执行$sh zkCli.sh 输 ...
- Luogu P5296 [北京省选集训2019]生成树计数
Luogu P5296 [北京省选集训2019]生成树计数 题目链接 题目大意:给定每条边的边权.一颗生成树的权值为边权和的\(k\)次方.求出所有生成树的权值和. 我们列出答案的式子: 设\(E\) ...
- 转://Oracle数据库升级后保障SQL性能退化浅谈
一.数据库升级后保障手段 为了保障从10.2.0.4版本升级到11.2.0.4版本更加平稳,我们事先采用了oracle性能分析器(SQL Performance Analyzer)来预测数据库的关键S ...
- open-falcon自定义push数据无法在grafana显示
使用open-falcon自定义push数据,在open-falcon中数据能正常显示,而在grafana中添加监控项时却无法显示. 由上述现象可判断可能是由于open-falcon的api组件有问题 ...
- 6-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇-优化升级(安装Apache (Web服务器)软件,测试HTTP)
为了和SDK升级保持协议一致,花了两天时间实现了用LUA开发,MQTT+HTTP方式实现远程升级 安装Apache主要是为了实现通过HTTP下载资源 升级介绍: 0,用户点击检查更新时,APP首先通过 ...
- FineUI十周年纪念版即将发布(基于像素的响应式布局,独此一家)!
[新版预报]FineUI十周年纪念版(v5.0.0)即将于2018-04-23发布! 官网示例已更新:http://pro.fineui.com/ 特别助攻:基于像素的响应式布局,FineUI独家秘笈 ...
- 这段代码,c 1秒,java 9秒,c# 14秒,而python。。。
哎,不得不说最近见得键盘侠客太多了,做程序员没两天总是喜欢上嘴唇触天,下嘴唇碰地的吹. 自己分明都没用过几门语言,就对各门语言评头论足说三道四,这么语言多好那门语言有多烂. 可能是随着时间也变得没那么 ...
- Asp.Net Core SignalR 用泛型Hub优雅的调用前端方法及传参
继续学习 最近一直在使用Asp.Net Core SignalR(下面成SignalR Core)为小程序提供websocket支持,前端时间也发了一个学习笔记,在使用过程中稍微看了下它的源码,不得不 ...
- hdu-1052(贪心)
链接 [https://vjudge.net/contest/261555#problem/I] 题意 就是两个人都有n匹马,每只马都有战力 第二个人出马的顺序是战力大到小,请问第一个人采取怎样的策略 ...