关于Java Web会话处理如何工作的困惑。使用servlet API和HttpSession对象使Cookies和标头的差异变得神秘
您可以阅读描述Cookies和相关标头Set-Cookie``Cookie的RFC,并了解它们是什么。
你可以通过在第7章Servlet规格,如果你想详细了解如何cookie和session有关系。
您首先需要了解HTTP是无状态协议。这意味着客户端发出的每个请求都与任何先前或将来的请求无关。但是,作为用户,我们非常希望在与Web应用程序交互时具有某种状态。例如,银行应用程序只希望您能够查看和管理交易。音乐流媒体网站可能希望根据您已经听到的内容推荐一些好的节奏。
为此,引入Cookie和Session概念。Cookies是键值对,但具有特定格式(请参阅链接)。会话是服务器端实体,用于存储跨越服务器和客户端之间的多个请求/响应的信息(在内存中或持久存储)。
该ServletHTTP会话使用与名字的cookie JSESSIONID和值标识会话。
该Servlet容器保持的地图(YMMV)HttpSession对象和这些标识符。当客户端第一次发出请求时,服务器会创建一个HttpSession具有唯一标识符的对象,并将其存储在其映射中。然后Set-Cookie在响应中添加标题。它将cookie的名称设置为,JSESSIONID并将其值设置为刚创建的标识符。
这是服务器使用的最基本的Cookie。您可以根据需要设置任意数量的信息。该ServletAPI使用该HttpServletResponse#addCookie(Cookie)方法为您简化了操作,但是您可以使用该HttpServletResponse#addHeader(String,String)方法自己完成操作。
客户端接收这些cookie,并将其存储在某个地方,通常存储在文本文件中。向服务器发送新请求时,它可以使用请求Cookie标头中的cookie来通知服务器它可能已经完成了上一个请求。
当Servlet容器收到请求时,它将提取Cookie标头值,并尝试HttpSession使用JSESSIONIDcookie中的键从其映射中检索对象。这HttpSession则物体被连接到HttpServletRequest该对象Servlet容器创建并传递给你的Servlet。您可以使用setAttribute(String,Object)和getAttribute(String)方法来管理状态。
解决方法我正在学习Spring安全性和Spring MVC,但是我意识到我需要首先学习jsp Servlet和Java环境中的常规Web编程。
我对HttpServletRequest和HttpServletResponse对象以及如何使用它们向请求和响应对象添加标头以及它们与会话的关系感到困惑。
据我了解,Cookie就像Content-type和Accept一样是一种标头。通过使用特定于使用标头的上下文的方法,java servletapi使得使用标头变得容易。例如:
response.setContentType(String mimeType)response.setContentLength(int lengthInBytes)
我的困惑从这里开始。Cookie不是String或int,它是一个对象:
response.addCookie(Cookie cookie)response.getCookies()
由于cookie是标头的一种,因此我不能只使用以下内容:
String cookieVal = response.getHeader('cookie')
我很难理解会话管理及其与HttpServletRequest和HttpServletResponse API的关系。HttpSession对象的作用是什么?
HttpSession.getAttribute() // What is this getting??HttpSession.setAttribute('Bla Bla','valuetoset') // What is this setting?
相关文章:
1. html5 - 自己的H5页面如何集成支付宝支付2. python - beautifulsoup获取网页内容的问题3. Python爬虫如何爬取span和span中间的内容并分别存入字典里?4. mysql优化 - 关于mysql分区5. python - 能通过CAN控制一部普通的家用轿车吗?6. 人工智能 - python 机器学习 医疗数据 怎么学7. centos7 编译安装 Python 3.5.1 失败8. mysql - 分库分表、分区、读写分离 这些都是用在什么场景下 ,会带来哪些效率或者其他方面的好处9. python - Django内使用filter过滤时间,只认年份不认月份是怎么回事?10. c++ - 请问MySQL_Connection::isReadOnly 怎么解决?
