在Servlet类中创建会话

时间:2013-03-25 01:53:52

标签: java servlets

我想在没有浏览器请求的情况下创建新会话。只有一个目的是存储来自其他系统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。我该怎么做?

(通常我们通常在请求时从浏览器获取会话。但在我的情况下我们不能因为它是从应用程序调用它自己) 谢谢!

3 个答案:

答案 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"); 

就像会话范围一样,它仍然由地图支持。