私はクラスを持っています:
@SessionScoped
public class LoggedUser {
private User user;
...
}
ユーザーがアプリケーションにログインしているかどうかを追跡するために使用します。
私の Struts2 アプリケーションには、ユーザーがログインしているかどうかを確認するインターセプターがあり、ログインしていない場合はログイン ページに転送されます。
public class LoggedUserInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 2822434409188961460L;
@Inject
private LoggedUser loggedUser;
@Override
public String intercept(ActionInvocation invocation) throws Exception {
if(loggedUser==null || !loggedUser.isLogged()){
return "login";
}
return invocation.invoke();
}
}
この問題は、セッションがタイムアウトしたときに発生します。オブジェクト LoggdeUser が null または削除されることはありません。私は常に最後のインスタンスを持っています。
セッションリスナーを追加しました。
public class SessionListener implements HttpSessionListener {
private static Logger logger = Logger.getLogger(SessionListener.class.getName());
@Override
public void sessionCreated(HttpSessionEvent event) {
logger.info("sessionCreated = " + event.getSession().getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent event) {
logger.info("sessionDestroyed = " + event.getSession().getId());
}
}
sessionDestroyed が呼び出されていることがわかりますが、Interceptor に再び入ると.. LoggedUser が新しいセッション用に再作成されることはありません。
なぜ ?
ログインのための私のStruts2アクションはこれです
public class LoginUserAction extends ActionSupport implements ModelDriven<LoggedUser>, ServletRequestAware {
...
@Inject
private LoggedUser loggedUser;
public String execute() throws Exception {
...
loggerUser.setLoggedTime(now);
...
return SUCCESS;
}
それもweb.xmlに追加します
セッション構成 セッションタイムアウト 2 /セッションタイムアウト /セッション構成