会话超时工作不同,因为我希望



我正在尝试为我的应用程序配置会话超时。

在web.xml中我配置了1分钟,像这样:

<session-config>
        <session-timeout>1</session-timeout>
    </session-config>

为了确保一切正常,我创建了一个监听器,参见:

<listener>
    <listener-class>br.com.sender.util.SessionListener</listener-class>
</listener>

查看我的listener类:

package br.com.sender.util;
import java.util.Date;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SessionListener implements HttpSessionListener {
    public void sessionCreated(HttpSessionEvent event) {
        System.out.printf("Session ID %s created at %s%n", event.getSession().getId(), new Date());
    }
    public void sessionDestroyed(HttpSessionEvent event) {
        System.out.printf("Session ID %s destroyed at %s%n", event.getSession().getId(), new Date());
    }
}

当我登录在我的应用程序会话被创建(在同一时刻,我存储一个UserMB与sessionScope),见:

Session ID 801040FAFEBC8D21C3C8E0DA56BF9B27 created at Tue Jun 10 18:44:33 BRT 2014

几分钟后,会话将被销毁:

Session ID 801040FAFEBC8D21C3C8E0DA56BF9B27 destroyed at Tue Jun 10 18:46:26 BRT 2014

当用户单击某些菜单或按钮时,会话再次创建,但我希望UserMB (SessionScope)被分发,用户必须再次登录,但它没有发生,用户继续使用应用程序而不重新登录。

您需要一个WebFilter来检查会话范围中的某些属性并确定用户是否登录

这完全取决于您如何配置您没有在问题中发布的security

如果您没有通过java ee web.xml安全设置或通过filter检查验证您的登录用户,那么您的页面不安全,当用户点击下一个URL时,session将被重新创建。

如果您没有使用容器安全或java ee安全,那么您可以使用某种过滤器来检查除登录之外的所有页面

@WebFilter("/*")
public class LoginFilter implements Filter {
    private ServletContext context;
    public void init(FilterConfig fConfig) throws ServletException {
        this.context = fConfig.getServletContext();
    }
    public void doFilter(ServletRequest request, ServletResponse response, 
        FilterChain chain) throws   IOException, ServletException {
        String requestURL = ((HttpServletRequest)request).getRequestURL().toString(); 
        HttpSession session = req.getSession(false);
        if(session == null && !(requestURL.endsWith("login.xhtml"))){
            ((HttpServletResponse)response).sendRedirect("login.xhtml");
        }else{
            chain.doFilter(request, response);
        }  
    } 
}

您可能在应用程序中编写了一些servlet或过滤器,拦截所有请求,然后将其转发给右控制器进行请求处理,因此在servlet/过滤器中,您必须检查session.getAttribute("someinfo") != null,如果为空,则将请求转发到登录页面

相关内容

  • 没有找到相关文章

最新更新