如何在刷新页面后保持会话活动状态

问题描述:

请问当用户刷新浏览器时,我应该如何保持主页会话的活动状态?如何在刷新页面后保持会话活动状态

因为登录后,主页会话是活着的。但是,当我刷新浏览器时,它将我带回登录页面。

import java.io.IOException; 
    import javax.servlet.Filter; 
    import javax.servlet.FilterChain; 
    import javax.servlet.FilterConfig; 
    import javax.servlet.ServletException; 
    import javax.servlet.ServletRequest; 
    import javax.servlet.ServletResponse; 
    import javax.servlet.annotation.WebFilter; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 

    /** 
    * 
    * @author Maxwell 
    */ 
    @WebFilter(filterName = "sessionFilter", urlPatterns = {"/*"}) 
    public class sessionFilter implements Filter { 

     @Override 
     public void init(FilterConfig filterConfig) throws ServletException { 

     } 

     @Override 
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
      HttpServletRequest req1 =(HttpServletRequest)request; 
      HttpServletResponse res1 =(HttpServletResponse)response; 

      String session = (String)req1.getSession().getAttribute("pnumber"); 
      String currentPath = req1.getRequestURL().toString(); 

      if(session != null) 
      { 
       if(currentPath.contains("login.xhtml")) 
       { 
        res1.sendRedirect(req1.getContextPath()+"/home.xhtml"); 
        System.out.println("it is nt empty"); 
       } 
       else 
       { 
        chain.doFilter(request, response); 
       } 
       //System.out.println("it is nt empty"); 
      } 
      else 
      { 
       if(currentPath.contains("home")) 
       { 
        res1.sendRedirect(req1.getContextPath()+"/login.xhtml"); 
        System.out.println("somefin is wrong"); 
       } 
       else 
       { 
        chain.doFilter(request, response); 
       } 
       //System.out.println("somefin is wrong"); 
      } 

     } 

     @Override 
     public void destroy() { 

     } 

    } 

当用户刷新浏览器时,我该如何保持家庭会话?

因为登录后,主页会话是活着的。但是,当我刷新浏览器时,它将我带回登录页面。

+0

有没有** jsf在您发布的代码中,只是一个servlet过滤器 – Kukeltje

刷新页面时,控制台中是否有任何警告或错误?那么,对于JSF中的会话管理,我会执行以下操作:

1)我会使用ManagedBean @SessionScoped,在用户信息登录后将其保存到SessionMap中:

public void login(){ 
    //your code 
    if(validations){ 
    FacesContext fc = FacesContext.getCurrentInstance(); 
    fc.getExternalContext().getSessionMap().put("loggedUser", User); 
    //User is the entity which contains the current user info. 
    //You can use any data to keep in the SessionMap ;-) 
    } 
} 

2)注销用户点击,你有失效会话:

FacesContext fc = FacesContext.getCurrentInstance(); 
fc.getExternalContext().invalidateSession(); 

3)现在,如果你想验证会话当用户键入直接的URL,而不从登录页面登录:

<f:event type="preRenderView" listener="#{loginBean.validateSession()}" /> 

public void validateSession(){ 
    FacesContext fc = FacesContext.getCurrentInstance(); 
    User currentUser = (User) fc.getExternalContext().getSessionMap().get("loggedUser"); 
    if(currentUser==null){ 
     //shows a message 'Session has caducated' 
     fc.getExternalContext().redirect("./login.xhtml"); 
    } 
} 

然后你只需渲染视图之前调用该方法

4)如果您想获得任何managedBean当前用户的数据,你必须从SessionMap得到它:

FacesContext fc = FacesContext.getCurrentInstance(); 
User user = (User) fc.getExternalContext().getSessionMap().get("loggedUser"); 

希望这可以帮助;-)

+0

谢谢;-),我已经完成了所有。但是,当用户登录并在用户页面上时,如果他决定刷新浏览器,他会自动重新导向回登录页面。即使在刷新浏览器之后,我仍然希望用户维护用户页面 – Maxwell