当前位置: 首页 > 知识库问答 >
问题:

关于java web会话处理如何工作的困惑。使用servlet api和HttpSession对象揭秘cookie和头的差异

梁浩涆
2023-03-14

我正在学习Spring security和Spring MVC,但我意识到我需要首先学习jsp Servlets和java环境中的一般web编程。

我对HttpServletRequest和HttpServletResponse对象以及如何使用它们向请求和响应对象添加标头以及它们与会话的关系感到困惑。

据我所知,cookie是一种标题类型,就像Content-type和Accept一样。java servlet api通过使用特定于使用头的上下文的方法,使处理头变得容易。例如:

response.setContentType(String mimeType)
response.setContentLength(int lengthInBytes)
response.addCookie(Cookie cookie)
response.getCookies()
String cookieVal = response.getHeader("cookie")
HttpSession.getAttribute() // What is this getting??
HttpSession.setAttribute("Bla Bla", "valuetoset") // What is this setting?

共有1个答案

彭鸿文
2023-03-14

您可以阅读描述cookie的RFC和相关的标头set-cookiecookie来理解它们是什么。

如果希望详细了解cookie和会话之间的关系,可以阅读servlet规范的第7章。

您首先需要了解HTTP是一个无状态协议。这意味着客户机发出的每个请求与以前或将来的任何请求都没有关系。但是,作为用户,我们非常希望在与web应用程序交互时有某种状态。例如,银行应用程序只希望您能够查看和管理您的交易。一个音乐流媒体网站可能会根据你已经听到的内容推荐一些好的节拍。

这是服务器使用的最基本的Cookie。你可以用你想要的任何信息设置它们的任何数量。ServletAPI使用HttpServletResponse#AddCookie(Cookie)方法使这一点更加简单,但是您可以使用HttpServletResponse#AddHeader(String,String)方法自己完成。

客户端接收这些cookie,并可以将它们存储在某个地方,通常是文本文件中。当向服务器发送新请求时,它可以使用请求的cookie标头中的cookie通知服务器它可能已经执行了以前的请求。

servlet容器接收到请求时,它提取cookie标头值,并尝试使用JSessionIDcookie中的键从映射中检索HttpSession对象。然后将这个HttpSession对象附加到Servlet容器创建的HttpServletRequest对象,并传递给您的Servlet。可以使用setAttribute(String,Object)getAttribute(String)方法来管理状态。

 类似资料:
  • 我是Android的新手,我对服务和线程的生命周期感到很困惑。 假设我有一个活动,它通过调用startService()在工作线程中启动服务。根据谷歌文档,即使调用组件被破坏,该服务也将无限期运行。 所以我的问题是:如果应用程序进程被完全销毁(退出并从后台堆栈中清理),服务是否仍在运行?UI线程是否仍在运行?如果是,这是否意味着即使其调用进程被破坏,线程也不一定会被终止?

  • Cookie提供客户端数据存储,仅支持少量数据。 通常,每个域2KB,这取决于浏览器。 Session提供服务器端数据存储,它支持大量数据。 让我们来看看如何在FuelPHP Web应用程序中创建cookie和会话。 Cookies FuelPHP提供了一个Cookie类来创建cookie项目。 Cookie类用于创建,分配和删除cookie。 配置Cookie Cookie类可以通过位于fuel

  • 当您可以调用递归方法而不是必须将递归方法设置为变量时,是否有一种简单的方法来理解? 例如... 只是调用递归函数遍历: self.recurse(node.left) self.recurse(node.right) 必须将递归函数设置为node。左和右。右: 节点。左=自我。递归(node.left) 节点。右=自我。递归(node.left) 另一个例子是删除bst中的一个节点,你必须将递归函

  • 1.首先,我想确认一下从编程的角度,我们有“静态类型检查”和“动态类型检查,对把? 2.一般情况下我们用typescript做静态类型检查,检查源码里面自定义数据类型,对把? 3.那么,我们做的所谓的动态类型检查是不是指的那些库,比如Joi,ajv什么的,比如你点击一个按钮,然后调这个库来检查一个obj的schema,如果类面的key value类型都能对的上,我们就通过,如果类型对不上,我们就报

  • 我正在使用ActiveMQ对电子邮件进行排队,消费者读取队列并发送电子邮件。 在启动时,我注册一个生产者,并永远缓存它。 有时,当连接关闭时,生产者无法将消息加入队列。 有人能告诉我处理闭门会议的最佳方式吗?我应该重新注册我的制作人吗?还是有办法重开会话?