Comment rediriger vers la page de connexion lorsque la Session est Expirée dans L'application Java web?

j'exécute une application web dans JBoss AS 5. J'ai aussi un filtre de servlet qui intercepte toutes les requêtes vers le serveur. Maintenant, je veux rediriger les utilisateurs vers la page de connexion, si la session a expiré. Je dois faire ceci 'isSessionExpired()' vérifier dans le filtre et je dois rediriger l'utilisateur en conséquence. Comment dois-je faire? Je fixe ma limite de temps de session sur le web.xml, comme ci-dessous:

<session-config>
    <session-timeout>15</session-timeout>
</session-config>
40
demandé sur Joshua Taylor 2009-06-22 16:10:49

9 réponses

vous pourriez utiliser un Filtre et faites le test suivant:

HttpSession session = request.getSession(false);// don't create if it doesn't exist
if(session != null && !session.isNew()) {
    chain.doFilter(request, response);
} else {
    response.sendRedirect("/login.jsp");
}

le code ci-dessus n'a pas été testé.

Ce n'est pas la solution la plus répandue. Vous devriez également tester qu'un objet ou un drapeau spécifique à un domaine est disponible dans la session avant de supposer que, parce qu'une session n'est pas Nouvelle, l'utilisateur doit s'être connecté. Être paranoïaque!

52
répondu Alex 2015-10-11 08:08:55

comment rediriger vers la page de connexion lorsque la Session est Expirée dans L'application Java web?

C'est une mauvaise question. Vous devez différencier les cas de "l'Utilisateur n'est pas connecté" et "Session expirée". Fondamentalement, vous voulez rediriger vers la page de connexion lorsque l'utilisateur n'est pas connecté. Pas quand la session est Expirée. La réponse actuellement acceptée ne vérifie que HttpSession#isNew(). Mais cela échoue évidemment lorsque l'Utilisateur a envoyé plus d'une requête dans le même session lorsque la session est implicitement créée par le JSP ou quoi d'autre. Par exemple: en appuyant simplement sur F5 sur la page de connexion.

Comme l'a dit, vous devez vérifier si l'utilisateur est connecté ou non. Étant donné le fait que vous posez ce genre de question alors que les cadres d'authentification standard comme j_security_check, Shiro, Spring Security, etc déjà gérer cela de manière transparente (et donc il ne serait pas nécessaire de poser ce genre de question sur eux), cela ne peut que signifier que vous utilisez un approche d'authentification maison.

en supposant que vous stockez l'utilisateur connecté dans la session dans un login servlet comme ci-dessous:

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    @EJB
    private UserService userService;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        User user = userService.find(username, password);

        if (user != null) {
            request.getSession().setAttribute("user", user);
            response.sendRedirect(request.getContextPath() + "/home");
        } else {
            request.setAttribute("error", "Unknown login, try again");
            doGet(request, response);
        }
    }

}

alors vous pouvez vérifier cela dans un login filtre comme ci-dessous:

@WebFilter("/*")
public class LoginFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {    
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpSession session = request.getSession(false);
        String loginURI = request.getContextPath() + "/login";

        boolean loggedIn = session != null && session.getAttribute("user") != null;
        boolean loginRequest = request.getRequestURI().equals(loginURI);

        if (loggedIn || loginRequest) {
            chain.doFilter(request, response);
        } else {
            response.sendRedirect(loginURI);
        }
    }

    // ...
}

Pas besoin de jouer avec cassants HttpSession#isNew() vérifie.

16
répondu BalusC 2017-05-23 12:09:45

vous pouvez aussi le faire avec un filtre comme ceci:

public class RedirectFilter implements Filter {

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req=(HttpServletRequest)request;

    //check if "role" attribute is null
    if(req.getSession().getAttribute("role")==null) {
        //forward request to login.jsp
        req.getRequestDispatcher("/login.jsp").forward(request, response);
    } else {
        chain.doFilter(request, response);
    }
}
}

vous pouvez voir le reste dans ce tutoriel

8
répondu kafrlust 2012-06-06 11:26:06

Vérifier la session est nouvelle.

HttpSession session = request.getSession(false);
if (!session.isNew()) {
  // Session is valid
}
else {
  //Session has expired - redirect to login.jsp
}
5
répondu zkarthik 2009-06-22 21:55:11

a l'intérieur du filtre injecte ce JavaScript qui va amener la page de connexion comme ceci. Si vous ne le faites pas, alors dans votre appel AJAX vous obtiendrez la page de connexion et le contenu de la page de connexion sera ajouté.

à l'Intérieur de votre filtre ou de redirection insérer ce script:

String scr = "<script>window.location=\""+request.getContextPath()+"/login.do\"</script>";
response.getWriter().write(scr);
5
répondu mukut 2012-02-22 21:40:00

vous devez mettre en œuvre le HttpSessionListener interface, le serveur avertira les temps morts de session.

comme ceci:

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class ApplicationSessionListener implements HttpSessionListener {

public void sessionCreated(HttpSessionEvent event) {
   System.out.println("Session Created");
 }

public void sessionDestroyed(HttpSessionEvent event) {
   //write your logic
   System.out.println("Session Destroyed");
  }
 }

cochez cet exemple pour une meilleure compréhension

http://www.myjavarecipes.com/how-to-catch-session-timeouts/

2
répondu Sunil Pidugu 2015-11-16 06:18:37

Jusqu'à la fin de la session, nous obtenons une requête normale, après quoi nous obtenons une requête Ajax. Nous pouvons l'identifier de la façon suivante:

String ajaxRequestHeader = request.getHeader("X-Requested-With");
if ("XMLHttpRequest".equals(ajaxRequestHeader)) {
    response.sendRedirect("/login.jsp");
}
1
répondu Anirudh Jadhav 2015-05-19 06:48:27

j'ai trouvé cette possible solution:

public void logout() {
    ExternalContext ctx = FacesContext.getCurrentInstance().getExternalContext();
    String ctxPath = ((ServletContext) ctx.getContext()).getContextPath();
    try {
        //Use the context of JSF for invalidate the session,
        //without servlet
        ((HttpSession) ctx.getSession(false)).invalidate();
        //redirect with JSF context.
        ctx.redirect(ctxPath + "absolute/path/index.jsp");
    } catch (IOException ex) {
        System.out.println(ex.getMessage());
    }
}
0
répondu LoGos 2015-09-17 07:07:14

quand l'utilisation se connecte, mettez son nom d'utilisateur dans la session:

`session.setAttribute("USER", username);`
<%
String username = (String)session.getAttribute("USER");
if(username==null) 
// if session is expired, forward it to login page
%>
<jsp:forward page="Login.jsp" />
<% { } %>
-2
répondu sampath 2011-12-31 14:56:01