0

セッション中のオブジェクトの処理で問題に直面しています。

このようにオブジェクトをセッションに保存します。object がオブジェクトの名前であると仮定します。私はアクションクラスでこれを行います:

if(object!=null)
{
session.settAttribute("objectName",object);
return mapping.findForward("success");
}
else
{
return mapping.findForward("failure");
}

成功と失敗の両方を同じ JSP ページにマップします。のようにチェックします

if(session.getAttribute("objectName")!=null)
    {
      object=  (SomeObjectClass)session.getAttribute("objectName");
    }
   if(object!=null)
   {
    //Do this
   }
   else
   {
    //Do that
   }

ここに私の問題があります。セッションで初めてオブジェクトを設定するときは問題ありません。このアクション クラスを 2 つの異なるブラウザーから同時に呼び出すと、問題が発生します。1 つのケースでは else 部分に、1 つのケースでは if 部分に移動します。これは、セッションがスレッドセーフではないためだと思います。解決策はありますか?

4

2 に答える 2

1

2 つのブラウザ間で同じ情報を表示しようとしているとおっしゃいました...共有しようとしている情報が「グローバル」である場合 (つまり、アプリケーションのすべてのユーザーで同じである必要がある場合は、情報を保存する必要があります)セッション スコープではなく、アプリケーション スコープ内です (スコープの説明については、http://java.sun.com/developer/onlineTraining/JSPIntro/contents.html#JSPIntro5を参照してください)。

ServletContext servletContext = getServlet().getServletContext(); //"application scope"
SomeObjectClass object = (SomeObjectClass) servletContext.getAttribute("objectName");

if(object !=null){
  //Do this
} else {
  //Do that
}

アカウントとログイン メカニズムがあり、同じログインで 2 つの異なるブラウザーで同じ情報を表示したい場合は、別の問題があります。その場合、情報は「データベース」に格納する必要があり (永続化の必要性に応じて、rdbms である必要はなく、アプリケーション スコープになる可能性があります)、ユーザーを使用してアクション クラスで情報を取得する必要があります。セッション、クッキーなどに保存される可能性のある情報。

//get the user info from the session, cookies, whatever
UserInfoObject userInfo = getUserInfo(request);
//get the object from the data store using the user info
SomeObjectClass object = getObjectForUser(userinfo);

if(object !=null){
  //Do this
} else {
  //Do that
}
于 2009-12-29T19:40:00.947 に答える
0

別のブラウザからアクション/ページにアクセスすると、新しいセッションが作成されます。最新のブラウザーでは、タブまたはビュー間でセッションを共有できます。より多くのブラウザーとセッションを共有する唯一の方法は、URL で jSessionid パラメータを使用することです。

于 2009-10-15T06:06:38.173 に答える