“从来不跌倒不算光彩,每次跌倒后能再站起来,才是最大的荣耀。”你好,我是梦阳辰,快和我一起学习起来吧!
会话技术
Web应用中的会话过程类似于生活中的打电话过程,它指的是一个客户端(浏览器)于web服务器之间连续发生的一系列请求和响应的过程。
会话:一次会话中包含多次请求和响应。
—次会话:浏览器第一次给服务器资源发送请求,会话建立,查到有一方断开为止。
功能:在一次会话的范围内的多次请求间,共享数据。
方式:
客户端会话技术:Cookie
服务器端会话技术: Session
1.概念:客户端会话技术,将数据保留在客户端。
快速入门
使用步骤:
1.创建Cookie对象,绑定数据。
new Cookie(String name, String value)
2.发送Cookie(发给浏览器)
reponse.addCookie(Cookie cookie);
3.获取Cookie,拿到数据(浏览器将cookie包装在请求中,服务器就可以拿到cookie)
Cookie[] request.getCookies();
测试:
@WebServlet("/ServletCookieTest1")
public class ServletCookieTest1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建Cookie对象
Cookie c =new Cookie("name","meng");
//发送Cookie
response.addCookie(c);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
@WebServlet("/ServletCookieTest2")
public class ServletCookieTest2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//3.获取Cookie
Cookie[] cs = request.getCookies();
if(cs!=null){
for (Cookie c :cs){
String name = c.getName();
String value = c.getValue();
System.out.println(name+":"+value);
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
结果:访问1,再访问2后。
1.原理图解:
2.cookie能否发送多个cookie?
可以!
可以创建多个Cookie对象,使用response调用多次addCookie方法发送Cookie即可。
@WebServlet("/ServletCookieTest3")
public class ServletCookieTest3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建Cookie对象
Cookie c1 =new Cookie("name","meng");
Cookie c2 =new Cookie("firstName","YangChen");
//发送Cookie
response.addCookie(c1);
response.addCookie(c2);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
3.cookie在浏览器中保存多长的时间?
1.默认情况下,当浏览器关闭后,Cookie数据被销毁(在浏览器内存中)。
2.在浏览器关闭后,仍然保存下来。
持久化存储:
setMaxAge(int seconds);
1.正数:将Cookie数据写到硬盘文件中,持久化存储,cookie存活时间。
2.负数:默认值。
3.零:删除cookie信息。
@WebServlet("/ServletCookieTest4")
public class ServletCookieTest4 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建Cookie对象
Cookie c =new Cookie("msg","setMaxAge");
//2.设置存活时间
c.setMaxAge(60);
//发送Cookie
response.addCookie(c);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
4.cookie能不能存储中文数据?
Tomcat8之前cookie中不能支持中文数据。
需要将中文数据转码------------------一般用url编码。
value = URLEncoder.encode(value,"utf-8");
cookie.setValue(value);
//输出时还需要解码
value =URLDecoder.decode(value,"utf-8");
Tomcat8之后完全没得问题(但对特殊字符还是不行)。
5.cookie数据共享范围有多大?
假设在一个tomcat服务器中,部署了多个web项目,那么在这些项目中cookie能不能共享?
默认情况下cookie不能共享。
setPath(String path):设置cookie的获取范围。
默认情况下,设置当前的虚拟目录(项目)。
如果要共享,则可以将path设置为“/”。(根路径)
不同的tomcat服务器间Cookie共享问题?
setDomain(String path):
如果设置以及域名相同,那么多个服务器之间cookie可以共享
setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie
可以共享
Cookie的特定和作用
1.cookie存储数据在客户端浏览器(不安全)。
2.浏览器对于单个cookie的大小有限制(4kb)以及同一个域名下的总cookie数量也有限制。
3.cookie一般用于存储少量的不太敏感数据。
4.在不登录的情况下,完成对服务器的身份识别。
1.记录上一次访问网站的时间。
需求:
1.访问一个servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。2.如果不是第一次访问,则提示∶欢迎回来,您上次访问时间为:显示时间字符串
分析
1.可以采用cookie来完成
2.在服务器中的servlet判断是否有一个名为lastTime的cookie
有:不是第一次访问.
响应数据:欢迎回来,您上次访问时间为:2018年6月10日11:50:202.写cookie
2.没有:是第一次访问。
1.响应数据:您好,欢迎您首次访问
2.写回cookie : lastTime=2020年11月13
@WebServlet("/ServletCookieTest5")
public class ServletCookieTest5 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//1.获取所有的Cookie
Cookie[] cookies = request.getCookies();
//2.遍历Cookie数组
boolean flag= false;//没有Cookie为lastTime
if(cookies!=null&&cookies.length>0){
for(Cookie cookie :cookies){
//3.获取Cookie的名字
String name = cookie.getName();
//4.判断Cookie名称是否是:lastTime
if("lastTime".equals(name)){
flag = true;
//5.有该Cookie,则不是第一次访问
//获取当前时间的字符串,重新设置Cookie的值,重新发送Cookie
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str_date = sdf.format(date);
str_date = URLEncoder.encode(str_date,"utf-8");
cookie.setValue(str_date);
//设置Cookie的存活时间
cookie.setMaxAge(60*60*24*30);//一个月
response.addCookie(cookie);
//响应数据
//获取Cookie的value,时间
String value = cookie.getValue();
value = URLDecoder.decode(value,"utf-8");
out.print("欢迎回来,你上次访问的时间是:"+value);
break;
}
}
}
if(cookies==null||cookies.length==0||flag==false){
//没有,则是第一次访问
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str_date = sdf.format(date);
str_date = URLEncoder.encode(str_date,"utf-8");
Cookie cookie = new Cookie("lastTime",str_date);
//设置Cookie的存活时间
cookie.setMaxAge(60*60*24*30);//一个月
response.addCookie(cookie);
out.print("你好,欢迎你首次访问!");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException