如何在刷新页面后保持会话活动状态
问题描述:
请问当用户刷新浏览器时,我应该如何保持主页会话的活动状态?如何在刷新页面后保持会话活动状态
因为登录后,主页会话是活着的。但是,当我刷新浏览器时,它将我带回登录页面。
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() {
}
}
当用户刷新浏览器时,我该如何保持家庭会话?
因为登录后,主页会话是活着的。但是,当我刷新浏览器时,它将我带回登录页面。
答
刷新页面时,控制台中是否有任何警告或错误?那么,对于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
有没有** jsf在您发布的代码中,只是一个servlet过滤器 – Kukeltje