我想在没有浏览器请求的情况下创建新会话。只有一个目的是存储来自其他系统API的数据(我将创建timer-scheduler以从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。我该怎么做?
(通常我们通常在请求时从浏览器获取会话。但在我的情况下我们不能因为它是从应用程序调用它自己) 谢谢!
答案 0 :(得分:0)
根据定义,会话是存储用户数据的位置。
如果您没有提出请求的用户,则无法为他们创建会话。
您说您希望从其他API获取一些数据并进行处理,如果是这样,您为什么需要将这些数据保存在会话中?
如果来自API的数据是每个用户,那么您可以将其存储在该用户会话中,如果它是整个应用程序,您可以将其存储在应用程序级别并根据需要进行刷新。
这是在处理之前需要将数据存储在内存中,在检索之后的某个时间。否则,为什么不直接从调度程序处理它呢?
你的解决方案似乎对我来说有点误导,但可能是我错过了一些明显的东西。
答案 1 :(得分:0)
您的问题中的问题是通信的多样性及其相互关联性,通常被理解为Web应用程序中的范围。
简而言之,您无法从应用程序范围的bean或servlet访问会话,也无法从会话访问请求范围的数据。另一方面,情况恰恰相反:您可以从会话中访问应用程序数据,并从请求范围的上下文中访问会话数据(当然,请记住可信的并发问题)。
如果你仔细考虑它,那就更有意义了:如何从Servlet#init
访问会话数据:每个应用程序范围的上下文中有许多会话作用域对象。您可以改为创建一个与数据范围一一对应的应用程序作用域bean。
最后,除了Thihara的回答之外,我会说创建HTTP会话所需的不是用户本身,而是至少有一个不同的请求,无论是通过用户身份验证做出的,匿名访客的行为,如创建购物车或计算机机器人爬行您的Web应用程序。在这方面,如其他地方所述,会议将与发起该请求的主题相关联(该会议有一些操作)。
至于继续解决问题的可能方法,您必须仔细重新考虑Web应用程序数据的范围。 SO上有许多优秀的答案,包括最近的答案,解决我的问题,我会留给你寻找。
答案 2 :(得分:0)
我认为Web应用程序中可用的不同范围是用于存储内容的不同框。
听起来我想要在会话范围内存储来自其他API的数据,尽管没有会话。我不认为将它存储在会话中对你有任何好处 - 它只能从同一个会话访问,并且当会话到期时(启动tomcat后不久),根本无法访问数据。有什么意义呢?
如果您存储在应用程序范围内,则可以从任何其他(实际)会话访问数据。
从servlet中,可以通过以下方式访问Application(Servlet)作用域:
getServletContext().setAttribute("key", object);
Object object = getServletContext().getAttribute("key");
就像会话范围一样,它仍然由地图支持。