我有一堂课:
@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 永远不会为空或被删除。我总是最后一个例子。
我添加了一个会话监听器。
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 /会话超时 /会话配置