1.Cookie对象

1.1常见的方法

(1)创建Cookie对象,绑定数据

  new Cookie(String name, String value)

(2)发送Cookie对象

  response.addCookie(Cookie cookie)

(3)获取Cookie,拿到数据

  Cookie[]  request.getCookies()

示例:

@WebServlet("/cookieDemo")
public class CookieDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取Cookie
Cookie[] cs = req.getCookies(); // 遍历Cookies[]
if (cs != null){
for (Cookie c : cs) {
String name = c.getName();
String value = c.getValue();
System.out.println(name + ":" + value);
}
}
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}

1.2Cookie的实现原理

基于响应头set-cookie和请求头cookie实现

1.3Cookie的细节

(1)一次可不可以发送多个cookie?

可以。可以创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即可。

(2)cookie在浏览器中保存多长时间?

默认情况下,当浏览器关闭后,Cookie数据被销毁(保存在浏览器内存)。但是我们可以设置cookie的保存时间(持久化到硬盘)。具体方法:

setMaxAge(int seconds)

1. 正数:将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间,时间到后,cookie文件自动失效
2. 负数:默认值
3. 零:删除cookie信息

(3)cookie能不能存中文?

在tomcat 8 之前 cookie中不能直接存储中文数据,需要将中文数据转码---一般采用URL编码。
在tomcat 8 之后,cookie支持中文数据。特殊字符还是不支持,建议使用URL编码存储,URL解码解析

(4)假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?

默认情况下不可以。但是可以设置。setPath(String path):设置cookie的获取范围。默认情况下是设置为当前的虚拟目录。如果要共享,则可以将path设置为"/"。

(5)不同的tomcat服务器间cookie共享问题?

setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享。

例如:

setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享


2.HttpSession对象

2.1常见的方法

(1)获取HttpSession对象

HttpSession session = request.getSession();

(2)使用HttpSession对象

Object getAttribute(String name)  
void setAttribute(String name, Object value)
void removeAttribute(String name)

2.2实现原理

Session的实现是依赖于Cookie的。

刚开始没有Session对象时,HttpSession session = request.getSession();拿不到Session对象,此时服务端会自动创建一个Cookie对象,new Cookie(“JSESSIONID”, [这里是session的id])。并发送Cookie对象给客户端。response.addCookie(Cookie cookie)。这时候request.getSession()就可以拿到Session的id了,然后根据id查询出Session对象。

如果本来客户端的Cookie就有Session的id。就直接获取到id并查询获取到Session对象了。

2.3HttpSession的细节

(1)当客户端关闭后,服务器不关闭,两次获取session是否为同一个?

默认情况下不是,因为Cookie一关闭浏览器就删除了。第二次再请求服务器,服务器如果要获取Session对象,就会再创建一个新的Session对象了。

但是我们可以设置Cookie的存活时间,来保证cookie重启了浏览器后还存在。

Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);

(2)客户端不关闭,服务器关闭后,两次获取的session是同一个吗?

很明显的,不是同一个。

但是如果服务器重启,丢失了原来的Session,是一件很惨的事情。比如你是一个商城应用,未登录的用户的购物车信息都存在服务器的Session对象里。突然你丢失了,用户的购物车数据全都不见了。有什么解决办法呢?

session的钝化:在服务器正常关闭之前,将session对象系列化到硬盘上
session的活化:在服务器启动后,将session文件转化为内存中的session对象即可。

如果我们的应用部署在Tomcat的webapps上,Tomcat服务器已经帮我们做好了session的钝化和活化了。但是在IDEA里面只有钝化,没有活化。(这里不细说了,感兴趣的自己了解下)。还有一个条件,必须是Tomcat正常关闭的前提下。所以还是自己做一下session的钝化和活化为好。具体就是把对象序列化到一个文件。

(3)session什么时候被销毁?

1. 服务器关闭
2. session对象调用invalidate() 。
3. session默认失效时间 30分钟(就算开着浏览器,30分钟没有操作Session,服务器也会自动销毁)
选择性配置修改    
<session-config>
  <session-timeout>30</session-timeout>
</session-config>

2.4session的特点

1. session用于存储一次会话的多次请求的数据,存在服务器端
2. session可以存储任意类型,任意大小的数据

2.5Session与Cookie的区别?

1. session存储数据在服务器端,Cookie在客户端
2. session没有数据大小限制,Cookie有
3. session数据安全,Cookie相对于不安全

Cookie对象与Session对象-java的更多相关文章

  1. 什么是Cookie对象,Session对象,Application对象。

    Cookie是: 一个由网页服务器放在您硬盘上的非常小的文本文件. 它本质上就像您的身份证明一样,并且不能像代码那样被执行或被用来散布病毒.它只能被您使用并且只能由提供的服务器读取. 使用Cookie ...

  2. Application对象、Session对象、Cookie对象、Server对象初步认识

    Application对象:记录应用程序参数的对象 用于共享应用程序级信息,即多个用户共享一个Application对象.在第一个用户请求ASP.NET文件时,将启动应用程序并创建Applicatio ...

  3. [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  4. JAVA-JSP内置对象之session对象

    相关资料:<21天学通Java Web开发> session对象 1.session对象用来表示用户的会话状况,一般用于保存用户的各种信息.2.直到生命周期超时或者被认为释放掉为止. 方法 ...

  5. JAVA-JSP内置对象之session对象获得session的其他信息

    相关资料:<21天学通Java Web开发> session对象 获得session的其他信息 SessionDemo2.jsp <%@ page language="ja ...

  6. JAVA-JSP内置对象之session对象设置并获得session生命周期

    相关资料:<21天学通Java Web开发> session对象设置并获得session生命周期1.通过session对象的setMaxInactiveInterval()方法可以设置se ...

  7. .net 内置对象之Session对象和Session的过期时间

    QQ:827969653 有需要的朋友可以下载Session类:SessionHelper类 http://technet.microsoft.com/zh-cn/library/system.web ...

  8. 初识 Asp.Net内置对象之Session对象

    Session对象 Session对象用于存储在多个页面调用之间特定用户的信息.Session对象只针对单一网站使用者,不同的客户端无法相互访问.Session对象中止联机机器离现时,,也就是当网站使 ...

  9. springMVC中得到request对象,session对象

    RequestAttributes ra = RequestContextHolder.getRequestAttributes(); HttpServletRequest request = ((S ...

随机推荐

  1. 【BZOJ1068】压缩(动态规划)

    [BZOJ1068]压缩(动态规划) 题面 BZOJ 洛谷 题解 比较简单的\(dp\) 设\(f[i][j]\)表示当前已经匹配到了原串的第\(i\)个位置,上一个\(M\)在第\(j\)个字符之后 ...

  2. Redis Scan迭代器遍历操作原理(二)

    续上一篇文章 Redis Scan迭代器遍历操作原理(一)–基础 ,这里着重讲一下dictScan函数的原理,其实也就是redis SCAN操作最有价值(也是最难懂的部分). 关于这个算法的源头,来自 ...

  3. bzoj2054: 疯狂的馒头(并查集)

    每个区间只被覆盖一次,求每个点被哪种区间覆盖或者某个区间是否已经被覆盖过都可以用并查集做. 做法:每个点都指向当前被覆盖区间的右端点+1的位置,某个点的下一个没被覆盖的点是gf(i),同理如果某个区间 ...

  4. Python3 字典 get() 方法

     Python3 字典 描述 Python 字典 get() 函数返回指定键的值,如果值不在字典中返回默认值. 语法 get()方法语法: dict.get(key, default=None) 参数 ...

  5. OpenCV图像变换(仿射变换与透视变换)

    仿射变换(affine transform)与透视变换(perspective transform)在图像还原.图像局部变化处理方面有重要意义.通常,在2D平面中,仿射变换的应用较多,而在3D平面中, ...

  6. Hdu2433 Travel

    Travel Time Limit: 10000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  7. Codeforces 938.C Constructing Tests

    C. Constructing Tests time limit per test 1 second memory limit per test 256 megabytes input standar ...

  8. Codeforces 894.E Ralph and Mushrooms

    E. Ralph and Mushrooms time limit per test 2.5 seconds memory limit per test 512 megabytes input sta ...

  9. tomcat8 的 websocket 支持

    使用 tomcat8 开发 WebSocket 服务端非常简单,大致有如下两种方式. 1.使用注解方式开发,被 @ServerEndpoint 修饰的 Java 类即可作为 WebSocket 服务端 ...

  10. Python之数据库导入(py3.5)

    数据库版本:MySQL Python版本:3.5 之前用想用MySQLdb来着,后来发现py3.5版本不支持,现选择pymysql 现在想将数据库adidas中的表jd_comment读取至pytho ...