[Seasar-user:17428] Re: [S2Container][SAStruts] セッション格納の値について

Shinzo SAITO [E-MAIL ADDRESS DELETED]
2009年 5月 13日 (水) 15:30:38 JST


齊藤新三です。

> 普通にsession#invalidate()は使えますよ。

少しずれているかもしれませんが、私のほうでも似たようなことで悩んでいました。
普通のStrutsで組んでいたときは、session内のオブジェクトを掃除するためと、セキュリティのためにSessionIDをたびたび変更するために、例えば、ナビをクリックしてユースケースが切り替わるときなどに、以下のようなコードを記述していました。

HttpSession session = request.getSession();
UserValue userValue = (UserValue) session.getAttribute("UserValue");
session.invalidate();
session = request.getSession();
session.setAttribute("UserValue", userValue);

ここでいうUserValueはログインユーザーを判別するためのオブジェクトととらえていただいて結構ですので、例えばログインIDだけでもOKです。

これと同じようなコードをSAStrutsで組むと、

@Resource
public HttpSession httpSession;

@Resource
public HttpServletRequest httpServletRequest;

UserValue userValue = (UserValue) httpSession.getAttribute("UserValue");
httpSession.invalidate();
httpSession = httpServletRequest.getSession();
httpSession .setAttribute("UserValue", userValue);

となると思うのですが、これで実行すると以下の例外が発生します。

java.lang.IllegalStateException: getAttributeNames: セッションは既に無効化されています
	org.apache.catalina.session.StandardSession.getAttributeNames(StandardSession.java:1041)
	org.apache.catalina.session.StandardSessionFacade.getAttributeNames(StandardSessionFacade.java:120)
	org.seasar.framework.container.hotdeploy.HotdeployHttpSession.getAttributeNames(HotdeployHttpSession.java:121)
	org.seasar.extension.filter.util.RequestDumpUtil.dumpSessionAttributes(RequestDumpUtil.java:162)
	org.seasar.extension.filter.RequestDumpFilter.dumpAfter(RequestDumpFilter.java:188)
	org.seasar.extension.filter.RequestDumpFilter.doFilter(RequestDumpFilter.java:129)
	org.seasar.framework.container.hotdeploy.HotdeployFilter.doHotdeployFilter(HotdeployFilter.java:86)
	org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:67)
	org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:79)
	org.seasar.struts.filter.RoutingFilter.forward(RoutingFilter.java:219)
	org.seasar.struts.filter.RoutingFilter.doFilter(RoutingFilter.java:99)
	org.seasar.framework.container.hotdeploy.HotdeployFilter.doHotdeployFilter(HotdeployFilter.java:99)
	org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:67)
	org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:79)
	org.seasar.extension.filter.EncodingFilter.doFilter(EncodingFilter.java:69)

結局、SessionIDの変更はあきらめてsession内の掃除目的に、以下のコードを記述しています。

UserValue userValue = (UserValue) httpSession.getAttribute("UserValue");
for(Enumeration sessionAttributeNames =
httpSession.getAttributeNames();
sessionAttributeNames.hasMoreElements();) {
	httpSession.removeAttribute((String) sessionAttributeNames.nextElement());
}
httpSession .setAttribute("UserValue", userValue);

この方法が適切かどうかわかりませんが。



2009/05/13 14:40 Yasuo Higa <[E-MAIL ADDRESS DELETED]>:
> ひがです。
>
>> 山元です。
>>
>> > あるいは、Seasar2にコンポーネント管理をさせて、ログインした
>> > タイミングで、loginFlagをonにする手もあります。
>>
>> ログイン時にセッションの破棄・再作成を行うのが主目的でして、
>> 例えば、上記の様にフラグでの制御であれば、ログアウトせずに
>> 別のアカウントでログインした場合に、ブラウザバックで戻られると
>> 不都合がないでしょうか。
>>
>> Seasar2(SAStruts?)ではセッションの破棄・再作成を自前で
>> 行うことは、やはり問題があるでしょうか?
>>
> 普通にsession#invalidate()は使えますよ。
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>



-- 
***********************
       齊藤  新三
E-mail [E-MAIL ADDRESS DELETED]
***********************


Seasar-user メーリングリストの案内