0

ブラウザからの要求なしに新しいセッションを作成したい。他のシステムのAPIからデータを保存し(APIからデータを取得するためのタイマースケジューラを作成します)、それを処理するという1つの目的だけがあります。

私は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#init:1つのアプリケーション全体のコンテキストごとに多くのセッションスコープのオブジェクトがあります。代わりに、データスコープに関して1対1で対応するアプリケーションスコープのBeanを作成できます。

最後に、Thiharaの回答に加えて、HTTPセッションを作成するために必要なのはユーザー自体ではなく、ユーザー認証、ショッピングカートやコンピューターボットの作成などの匿名ゲストのアクションによるものであるかどうかにかかわらず、少なくとも1つの明確な要求です。 Webアプリケーションをクロールします。その点で、他の場所で述べられているように、セッションは、その要求を開始したサブジェクト(セッションでいくつかの操作があった)に関連付けられます。

問題を解決するための可能な方法に進むには、Webアプリケーションのデータのスコープを慎重に再考する必要があります。SOには、最近の回答を含め、私が問題にしている問題に対処するための優れた回答がたくさんあります。

于 2013-03-25T05:45:49.577 に答える
0

Webアプリケーションで利用できるさまざまなスコープは、物を格納するためのさまざまなボックスだと思います。

セッションはありませんが、他のAPIからのデータをセッションスコープに保存したいようです。それをセッションに保存してもまったく役に立たないと思います-同じセッションからのみアクセスでき、セッションが期限切れになると(tomcatを開始した直後)、データにアクセスする方法はまったくありません。 。そのポイントは何ですか?

ストアがアプリケーションスコープ内にある場合、データは他の(実際の)セッションからアクセスできます。

サーブレットから、アプリケーション(サーブレット)スコープにアクセスできます。

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

セッションスコープと同様に、それはまだマップによって支えられています。

于 2013-03-25T13:31:09.343 に答える