0

我想在没有浏览器请求的情况下创建新会话。只有一个目的是存储来自其他系统的 API 的数据(我将创建计时器调度程序以从 API 获取数据)然后处理它。

我使用tomcat服务器。我在 web.xml 中配置如下:

<?xml version="1.0" encoding="UTF-8"?>
 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>TestSession</display-name>
<servlet>
  <servlet-name>initSmsSchedule</servlet-name>
  <servlet-class>test.TestSession</servlet-class>
   <load-on-startup>2</load-on-startup>
</servlet>

和我的 TestSession.java 类:

public class TestSession extends HttpServlet {


   public void init(ServletConfig config) throws ServletException {
     super.init(config);

     //I want to create a HttpSession in here

  }

所以有了这个配置。当tomcat启动时,它将运行到TestSession中的init()方法。

在 init() 方法中,我想在这里创建一个 HttpSession。我该怎么办?

(通常我们通常会在收到来自浏览器的请求时收到请求中的会话。但在我的情况下,我们不能,因为它是从应用程序本身调用的)谢谢!

4

3 回答 3

0

根据定义,会话是存储用户数据的地方。

如果您没有将提出请求的用户,则无法为他们创建会话。

您说您想从另一个 API 获取一些数据并对其进行处理,如果是这样,您为什么需要将这些数据保留在会话中?

如果来自 API 的数据是针对每个用户的,那么您可以将其存储在该用户会话中,如果是针对整个应用程序,您可以将其存储在应用程序级别并根据需要进行刷新。

这是如果数据需要在处理之前存储在内存中,在检索之后的某个时间。否则为什么不直接从调度程序处理它呢?

您的解决方案对我来说似乎有点误导,但可能是我遗漏了一些明显的东西。

于 2013-03-25T03:36:26.387 回答
0

您的问题中的问题是通信的多样性及其相互关联性,这通常被理解为 Web 应用程序中的范围界定。

简单地说,您不能从应用程序范围的 bean 或 servlet 访问会话,也不能从会话访问请求范围的数据。另一方面,反之亦然:您可以从会话访问应用程序数据,并从请求范围的上下文访问会话数据(当然要记住可能的并发问题)。

如果您仔细考虑,这很有意义:您如何从以下位置访问会话数据Servlet#init:每个应用程序范围的上下文中有许多会话范围的对象。相反,您可以创建一个应用程序范围的 bean,它与数据范围具有一一对应的关系。

最后,除了 Thihara 的回答,我想说创建 HTTP 会话所需的不是用户本身,而是至少一个不同的请求,无论是通过用户身份验证、匿名访客的操作(如创建购物车或计算机机器人)通过您的 Web 应用程序进行爬网。在这方面,如其他地方所述,会话将与发起该请求的主题相关联(对会话有一些操作)。

要着手解决问题的可能方法,您必须仔细重新考虑 Web 应用程序的数据范围。SO上有很多很好的答案,包括最近的答案,解决了我的问题,我会留给你去寻找。

于 2013-03-25T05:45:49.577 回答
0

我认为 Web 应用程序中可用的不同范围是用于存储内容的不同框。

在我看来,您希望将来自其他 API 的数据存储在会话范围内,尽管没有会话。我认为将它存储在会话中根本不会对您有任何好处-它只能从同一个会话中访问,并且当会话到期时(在启动 tomcat 后不久)将根本无法访问数据. 那有什么意义呢?

如果您存储在应用程序范围内,则可以从任何其他(真实)会话访问数据。

从 servlet,可以通过以下方式访问应用程序 (Servlet) 范围:

getServletContext().setAttribute("key", object);  
Object object = getServletContext().getAttribute("key"); 

就像 Session 范围一样,它仍然由 Map 支持。

于 2013-03-25T13:31:09.343 回答