JSP中的Cookie和Session

Stella981
• 阅读 779

1. cookie

1.1 什么是****cookie

       浏览器访问服务器时,服务器会将一些数据(少量的,4KB左右)以set-cookie消息头的方式发送给浏览器。浏览器会将这些数据保存下来(内存、或者以文件的形式保存在硬盘上)。当浏览器再次访问服务器时,会将这些数据以cookie消息头的方式发送过来。

1.2 如何创建****cookie

Cookie cookie=new Cookie(String name,String value);
response.addCookie(cookie);

1.3 如何查询****cookie

Cookie[] cookies=request.getCookies();

       需要注意的是:该方法可能返回null

       遍历该数组:

String cookieName=cookie.getName();
String cookieValue=cookie.getValue();

    1.4 编码问题

       cookie的值只能是ascii字符,对于中文,需要将其转换成对应的ascii字符的表示形式:

String code=URLEncoder.encode(String str,String code);//编码
String string=URLDecoder.decode(String str,String code);//解码

    1.5 cookie****的生存时间

cookie.setMaxAge(int sec);//设置cookie的生存时间,单位秒

       sec>0:浏览器会将cookie的值最多保存sec秒,如果浏览器关闭,会将cookie保存到硬盘上

       sec=0:立即删除该cookie

       sec<0:(缺省值)将cookie保存到内存中,如果浏览器关闭,cookie则被删除。

    1.6 删除****Cookie

        如果要删除一个名叫userprofile的cookie:

Cookie cookie=new Cookie(“userprofile”,””);//创建一个相同的cookie,这一个Cookie会去替换原来的cookie。
cookie.setMaxAge(0);//将新的cookie的生存时间设置为0
response.addCookie(cookie);//添加到response对象中

    1.7 路径问题

       浏览器向服务器发送请求时,会比较要访问的地址与cookie的地址(路径)是否匹配,只有匹配的cookie才会发送给服务器。

       cookie有一个默认的路径,等于创建该cookie的组件的路径。比如:

       在Web/app1/addCookie.jsp创建了一个cookie,则该cookie的路径等于“/Web/app1”.

       在”/Web/app1”相同的路径中,可以获取该cookie.

       设置cookie的路径:cookie.setPath(String path);

   例如:cookie.setPath(“/Web”);

规则: cookie的路径必须是要访问的路径的上层目录戒者是不要访问的路径相等,浏览器 才会将cookie发送给服务器。

一般可以设置setPath("/appname"),表示访问该应用下的所有地址,均会发送cookie。

    1.8 cookie****的限制

   cookie可以禁止

      cookie的大小有限制(4k左右)

      cookie的数量也有限制(浏览器大约能保存300个)

      cookie的值叧能是字符串,要考虑编码问题。

      cookie不安全

2. session

2.1 什么是****session

       浏览器在访问服务器时,服务器会在内存空间里创建一个session对象(该对象有一个唯一的ID号,类似于人的身份证号码,称之为sessionID)。服务器默认情况下会将sessionID以cookie的形式发送给浏览器,浏览器再次访问服务器时,会将sessionID发送过来,服务器可以通过sessionID找到对应的session对象。

2.2 如何获得****Session

HttpSession session=request.getSession();
HttpSession session=request.getSession(boolean flag);

       这两个方法都返回一个符合HttpSession接口要求的对象(session对象)。

       当flag=true;服务器会先检查请求当中是否有sessionID,如果没有,则创建一个session对象;如果有,服务器会依据该sessionID查找对应的session对象。如果找到则返回该对象,找不到则创建一个新的session对象。

       当flag=false;服务器会检查请求中是否有sessionID,如果没有,返回null;如果有,服务器根据sessionID查找对应的session对象,如果找到,则返回,找不到则返回null.

       注意:request.getSession()是request.getSesstion(true)的简写形式。

    2.3 session****接口提供的常用方法

String getId();//返回sessionId
setAttribute(String name,Object obj);//设置属性(绑定数据)
Object getAttribute(String name);//获取属性。如果不存在,则返回null.
removeAttribute(String name);//解除数据绑定

    2.4 session****超时

       服务器会将超过指定空闲时间(在指定的时间内,该session对象没有使用)的session对象销毁掉

       a.服务器一般会有一个默认的超时机制,大部分服务器都是30分钟。可以修改服务器的缺省超时时间。对于tomcat,可以修改安装目录下的/conf/web.xml中的:

<session-config>
   <session-timeout>30</session-timeout>
</session-config>

   另外,也可以只修改某个应用的web.xml,这种修改只对当前应用有效。

   b.也可以用代码的方式来实现:

session.setMaxInactiveInterval(int sec);//设置最大不活动间隔时间

    *2.5 删除session----使session无效*

session.invalidate();//设置session无效

    2.6 session案例:session验证

       a.在登录成功以后,在session对象上绑定相关的数据,比如:

 session.setAttribute(“user”,user);

       b.对于需要保护的资源(需要登录成功之后,才能访问的地址),添加session验证代码:

Object obj=session.getAttribute(“user”);
if(obj==null){
   //用户没有登录成功。跳转到登录页面
}else{
   //打开指定的页面
}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Django组件——cookie与session
Django组件——cookie与session<fontcolor00bff一、会话跟踪技术</font<fontcolorff7f501、什么是会话跟踪技术</font先了解一下什么是会话。可以把
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这