cookie和session

本文深入讲解了客户端技术Cookie和服务器端技术Session的工作原理、创建、获取及生命周期等内容,并提供了具体的代码示例。
cookie是客户端技术。程序把每个用户的数据以cookie形式写给用户的浏览器,浏览器可以存在缓存区或者用户的硬盘区。这样,当用户访问服务器的web资源时,就可以带着各自的数据去。我们访问某个网站时自动登录或者网站显示上次访问时间等可以通过cookie实现。
session是服务器端技术。服务器在运行时可以为每个用户的浏览器创建一个其独享的session对象,这样,可以把用户的数据放入session中,当用户浏览器再去访问服务器中的其他web资源时,可以通过session带着各自的数据区。我们注册时验证码的校检或购物时的购物车都可以通过session实现。
一、cookie。
(1)cookie的创建、发送、获取和删除。
创建:Cookie(String name, String value),cookie的构造函数,在创建cookie是传入cookie的名称和数据。setMaxAge(int expiry),设置cookie的有效时限,单位是秒,默认cookie有效期为浏览器进程,此时cookie存储在浏览器缓存区,浏览器关闭cookie就消失。 setPath(String uri) ,设置cookie的有效目录,比如设置有效目录为/news,那么浏览器访问news下的web资源都会带cookie,默认cookie由哪个servlet发出,有效路径即为servlet所在目录。
发送:response的addCookie(Cookie cookie)方法,只要在response里放入cookie,服务器在发现response里有cookie会自动发给浏览器。
获取:request的getCookies()方法会返回一个cookie数组,迭代数组就可去除想要的cookie。
删除:只要新的cookie的信息,包括名字、有效路径一致,并将时限设置为0,就会删除该cookie。
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");

PrintWriter writer=response.getWriter();
writer.print("您上次访问的时间是:");

//获得cookie
Cookie[] cookies=request.getCookies();
for(int i=0;cookies!=null&&i<cookies.length;i++){
if(cookies[i].getName().equals("lastAccessTime")){
long lastAccessTime=Long.parseLong(cookies[i].getValue()+"");
Date date=new Date(lastAccessTime);
writer.print(date.toLocaleString())
}
}

//向cookie发送最新时间数据
Cookie cookie=new Cookie("lastAccessTime",System.currentTimeMillis()+"");
cookie.setMaxAge(1*60*24*30);
cookie.setPath("/day20130928_servlet");
response.addCookie(cookie);

(2)cookie一些细节。
一个cookie只能标识一种信息,它至少含有该信息的名称和设置值。
一个web站点可以向一个web浏览器发送多个cookie,一个web浏览器也可以存储多个web站点的cookie。
删除cookie时,是将cookie的最大时限设置为0,注意path必须一致,否则无法删除。

二、session。
(1)session的创建、获取和生命周期。
创建、获取:request的getSession()方法再打一次被调用时服务器就会为浏览器创建一个session对象,而再次被调用时就会得到已创建的对象。需要注意的是有个getSession(boolean create)方法,可以限定是否创建session,如果传入false,那么就不创建session,只获取session,如果之前未创建session,也不再创建session,此方法可以在购物车是使用。
生命周期:getSession()方法第一次被调用时session被创建,而默认session对象在30分钟内未被调用将被销毁,即使30分钟内浏览器进程并未退出,当然也可能在session的invalidate()方法被调用时session摧毁。此时限可以通过web.xml配置更改,其时间单位分。
<session-config>
<session-timeout>10</session-timeout>
</session-config>

(2)session工作原理。
服务器为每个浏览器创建一个session对象,那它如何知道哪个session属于哪个浏览器呢?其实session技术依托于cookie技术,当session被创建后,服务器会向浏览器发送一个有session的id信息的cookie,这样,浏览器带着有session的id信息的cookie就能找到自己的session。当然如果没设置cookie的时限,默认是存在于整个浏览器进程,也就是浏览器关闭cookie就会销毁,那么即使没到session的销毁时限也不能找到浏览器上次访问的session。对此,我们可以通过更改cookie时限来延长session使用。比如做购物车,即使用户将浏览器关闭,只要在session摧毁前打开那么购物车内商品信息依然存在。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

HttpSession session= request.getSession();
//覆盖session的cookie
String sessionid=session.getId();
Cookie cookie=new Cookie("JSESSIONID",sessionid);
cookie.setPath("/day20130928_servlet");
//设置带有session的id信息的cookie时限
cookie.setMaxAge(1*60*30);
response.addCookie(cookie);
session.setAttribute("name", "Think Pad");
}

(3)cookie被禁时解决办法。
由于session依托于cookie,如果用户的cookie被禁用,那么即使服务器为浏览器创建了session,浏览器没有带有session的id信息的cookie,也无法使用属于浏览器的session,那么如果不解决,比如,一旦用户的浏览器由于某些原因被禁,对于卖家的网站,用户将无法购物,这样将对网站造成损失,解决办法就是可以依托超链接带session的id。可以调用response的encodeURL(String url)方法,它会自动在地址后带上session的id。不过需要注意的是,一旦浏览器关闭,那么在此访问将无法再次得到上次访问时的session,因为浏览器禁用cookie,带有session的id信息的cookie无法存在用户硬盘。

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer=response.getWriter();

//解决cookie被禁
request.getSession();

String url1=response.encodeURL("/day20130928_servlet/servlet/SessionDemo1");
String url2=response.encodeURL("/day20130928_servlet/servlet/SessionDemo2");

writer.print("<a href='"+url1+"'>购买</a>" );
writer.print("<a href='"+url2+"'>结账</a>" );
}
下载前可以先看下教程 https://pan.quark.cn/s/16a53f4bd595 小天才电话手表刷机教程 — 基础篇 我们将为您简单的介绍小天才电话手表新机型的简单刷机以及玩法,如adb工具的使用,magisk的刷入等等。 我们会确保您看完此教程后能够对Android系统有一个最基本的认识,以及能够成功通过magisk root您的手表,并安装您需要的第三方软件。 ADB Android Debug Bridge,简称,在android developer的adb文档中是这么描述它的: 是一种多功能命令行工具,可让您与设备进行通信。 该命令有助于各种设备操作,例如安装调试应用程序。 提供对 Unix shell 的访问,您可以使用它在设备上运行各种命令。 它是一个客户端-服务器程序。 这听起来有些难以理解,因为您也没有必要去理解它,如果您对本文中的任何关键名词产生疑惑或兴趣,您都可以在搜索引擎中去搜索它,当然,我们会对其进行简单的解释:是一款在命令行中运行的,用于对Android设备进行调试的工具,并拥有比一般用户以及程序更高的权限,所以,我们可以使用它对Android设备进行最基本的调试操作。 而在小天才电话手表上启用它,您只需要这么做: - 打开拨号盘; - 输入; - 点按打开adb调试选项。 其次是电脑上的Android SDK Platform-Tools的安装,此工具是 Android SDK 的组件。 它包括与 Android 平台交互的工具,主要由构成,如果您接触过Android开发,必然会使用到它,因为它包含在Android Studio等IDE中,当然,您可以独立下载,在下方选择对应的版本即可: - Download SDK Platform...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值