Java-Cookie会话技术

x33g5p2x  于2022-03-25 转载在 Java  
字(5.0k)|赞(0)|评价(0)|浏览(397)

什么是会话技术

基本概念: 指用户开一个浏览器,访问一个网站,只要不关闭该浏览器,不管该用户点击多少个超链接,访问多少资源,直到用户关闭浏览器,整个这个过程我们称为一次会话.

为什么我们要使用会话技术?

会话跟踪技术可以解决我们很多很多问题。

  • 在论坛登陆的时候,很多时候会有一个小框框问你是否要自动登陆,当你下次登陆的时候就不用输入密码了

  • 根据我以前浏览过的商品,猜我喜欢什么商品

什么是Cookie

Cookie是由W3C组织提出,最早由netscape社区发展的一种机制
网页之间的交互是通过HTTP协议传输数据的,而Http协议是无状态的协议。无状态的协议是什么意思呢?一旦数据提交完后,浏览器和服务器的连接就会关闭,再次交互的时候需要重新建立新的连接。

服务器无法确认用户的信息,于是乎,W3C就提出了:给每一个用户都发一个通行证,无论谁访问的时候都需要携带通行证,这样服务器就可以从通行证上确认用户的信息。通行证就是Cookie

Cookie的流程:浏览器访问服务器,如果服务器需要记录该用户的状态,就使用response向浏览器发送一个Cookie,浏览器会把Cookie保存起来。当浏览器再次访问服务器的时候,浏览器会把请求的网址连同Cookie一同交给服务器。

Cookie类用于创建一个Cookie对象

  • response接口中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段
  • request接口中定义了一个getCookies方法,它用于获取客户端提交的Cookie

常用的Cookie方法:

  • public Cookie(String name,String value)
  • setValue与getValue方法
  • setMaxAge与getMaxAge方法
  • setPath与getPath方法
  • setDomain与getDomain方法
  • getName方法

简单使用Cookie

创建Cookie对象,发送Cookie给浏览器、

//设置response的编码
       response.setContentType("text/html;charset=UTF-8");

       //创建Cookie对象,指定名称和值
       Cookie cookie = new Cookie("username", "zhongfucheng");
	   //设置Cookie的时间(必须否则不生效)
       cookie.setMaxAge(1000);
       //向浏览器给一个Cookie
       response.addCookie(cookie);

       response.getWriter().write("我已经向浏览器发送了一个Cookie");

发现文件夹中多了个Cookie的文本了

现在基本上cookie都不是存储在文件中了,比如Google Chrome使用SQLite文件来保存Cookie它位于:C:\Users\<your_username>\AppData\Local\Google\Chrome\User Data\Default\
下的Cookies文件中。这是一个SQLite数据库文件)

Cookie细节

Cookie不可跨域名性

很多人在初学的时候可能有一个疑问:在访问Servlet的时候浏览器是不是把所有的Cookie都带过去给服务器,会不会修改了别的网站的Cookie

答案是否定的。Cookie具有不可跨域名性。浏览器判断一个网站是否能操作另一个网站的Cookie的依据是域名。所以一般来说,当我访问baidu的时候,浏览器只会把baidu颁发的Cookie带过去,而不会带上google的Cookie。

Cookie保存中文

Cookie直接使用中文会报错的,我们需要对中文进行Unicode字符编码。

//对Unicode字符进行编码
       Cookie cookie = new Cookie("country", URLEncoder.encode(name, "UTF-8"));

取出Cookie的时候要对中文数据进行解码

Cookie[] cookies = request.getCookies();
       for (int i = 0; cookies != null && i < cookies.length; i++) {
           String name = cookies[i].getName();
           //中文数据进行解码
           String value = URLDecoder.decode(cookies[i].getValue(), "UTF-8");

           printWriter.write(name + "------" + value);
       }

Cookie的有效期

Cookie的有效期是通过setMaxAge()来设置的。

如果MaxAge为正数,浏览器会把Cookie写到硬盘中,只要还在MaxAge秒之前,登陆网站时该Cookie就有效【不论关闭了浏览器还是电脑】

如果MaxAge为负数,Cookie是临时性的,仅在本浏览器内有效,关闭浏览器Cookie就失效了,Cookie不会写到硬盘中。Cookie默认值就是-1。

如果MaxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie对应的方法,把MaxAge设置为0等同于删除Cookie

Cookie的修改和删除

上面我们已经知道了Cookie机制没有提供删除Cookie的方法。其实细心点我们可以发现,Cookie机制也没有提供修改Cookie的方法。那么我们怎么修改Cookie的值呢?

Cookie存储的方式类似于Map集合,如下图所示

Cookie的名称相同,通过response添加到浏览器中,会覆盖原来的Cookie。

注意: 删除,修改Cookie时,新建的Cookie除了value、maxAge之外的所有属性都要与原Cookie相同。否则浏览器将视为不同的Cookie,不予覆盖,导致删除修改失败!

Cookie的域名

Cookie的domain属性决定运行访问Cookie的域名。domain的值规定为“.域名”

Cookie的隐私安全机制决定Cookie是不可跨域名的。也就是说www.baidu.com和www.google.com之间的Cookie是互不交接的。即使是同一级域名,不同二级域名也不能交接,也就是说:www.goole.com和www.image.goole.com的Cookie也不能访问

现在我希望一级域名相同的网页Cookie之间可以相互访问。也就是说www.image.zhongfucheng.com可以获取到www.zhongfucheng.com的Cookie就需要使用到domain方法。

Cookie cookie = new Cookie("name", "ouzicheng");
       cookie.setMaxAge(1000);
       cookie.setDomain(".zhongfucheng.com"); 
       response.addCookie(cookie);

       printWriter.write("使用www.zhongfucheng.com域名添加了一个Cookie,只要一级是zhongfucheng.com即可访问");

注意: setDomain 如果加点有问题那么可以不加点直接zhongfucheng.com

Cookie的路径

Cookie的path属性决定允许访问Cookie的路径
一般地,Cookie发布出来,整个网页的资源都可以使用。现在我只想/Servlet1可以获取到Cookie,其他的资源不能获取。
,那么我们可通过setPath颁发一个Cookie给浏览器,设置路径为"/Servlet1"。

Cookie cookie = new Cookie("username", "java");
       cookie.setPath("/Servlet1"); //设置路径
       cookie.setMaxAge(1000);
       response.addCookie(cookie);
       printWriter.write("该Cookie只有Servlet1获取得到");

Cookie的安全属性

HTTP协议不仅仅是无状态的,而且是不安全的!如果不希望Cookie在非安全协议中传输,可以设置Cookie的secure属性为true,浏览器只会在HTTPS和SSL等安全协议中传输该Cookie。
当然了,设置secure属性不会将Cookie的内容加密。如果想要保证安全,最好使用md5算法加密。

设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,窃取cookie内容,这样就增加了cookie的安全性,即便是这样,也不要将重要信息存入cookie。XSS全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie、破坏页面结构、重定向到其它网站等。

Cookie的应用

显示用户上次访问的时间

其实就是每次登陆的时候,取到Cookie保存的值,再更新下Cookie的值。

全部代码如下:

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       response.setContentType("text/html;charset=UTF-8");
       PrintWriter printWriter = response.getWriter();


       //获取网页上所有的Cookie
       Cookie[] cookies = request.getCookies();

       //判断Cookie的值是否为空
       String cookieValue = null;
       for (int i = 0; cookies != null && i < cookies.length; i++) {

           //获取到以time为名的Cookie
           if (cookies[i].getName().equals("time")) {
               printWriter.write("您上次登陆的时间是:");
               cookieValue = cookies[i].getValue();
               printWriter.write(cookieValue);

               cookies[i].setValue(simpleDateFormat.format(new Date()));
               response.addCookie(cookies[i]);

               //既然已经找到了就可以break循环了
               break;
           }
       }

       //如果Cookie的值是空的,那么就是第一次访问
       if (cookieValue == null) {
           //创建一个Cookie对象,日期为当前时间
           Cookie cookie = new Cookie("time", simpleDateFormat.format(new Date()));

           //设置Cookie的生命期
           cookie.setMaxAge(20000);

           //response对象回送Cookie给浏览器
           response.addCookie(cookie);

           printWriter.write("您是第一次登陆啊!");
       }

通过上面逻辑我们,还可以显示上次浏览过商品,… 其他更多的操作自己去研究,

点赞 -收藏-关注-便于以后复习和收到最新内容有其他问题在评论区讨论-或者私信我-收到会在第一时间回复如有侵权,请私信联系我感谢,配合,希望我的努力对你有帮助^_^

相关文章