it-swarm.com.de

Wie kann ich zur Anmeldeseite umleiten, wenn die Sitzung in der Java Webanwendung) abgelaufen ist?

Ich verwende eine Webanwendung in JBoss AS 5. Ich habe auch einen Servlet-Filter, der alle Anfragen an den Server abfängt. Jetzt möchte ich die Benutzer auf die Anmeldeseite umleiten, wenn die Sitzung abgelaufen ist. Ich muss dazu 'isSessionExpired ()' im Filter einchecken und den Benutzer entsprechend umleiten. Wie mache ich es? Ich stelle mein Sitzungszeitlimit in web.xml wie folgt ein:

<session-config>
    <session-timeout>15</session-timeout>
</session-config>
45
Veera

Sie können ein Filter verwenden und den folgenden Test durchführen:

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");
}

Der obige Code ist ungetestet.

Dies ist jedoch nicht die umfassendste Lösung. Sie sollten auch testen, ob ein domänenspezifisches Objekt oder Flag in der Sitzung verfügbar ist, bevor Sie davon ausgehen, dass der Benutzer angemeldet sein muss, da eine Sitzung nicht neu ist. Seien Sie paranoid!

55
Alex

Umleiten zur Anmeldeseite nach Ablauf der Sitzung in Java Webanwendung?

Das ist eine falsche Frage. Sie sollten zwischen den Fällen "Benutzer ist nicht angemeldet" und "Sitzung ist abgelaufen" unterscheiden. Sie möchten grundsätzlich zur Anmeldeseite umleiten, wenn der Benutzer nicht angemeldet ist. Nicht, wenn die Sitzung abgelaufen ist. Die aktuell akzeptierte Antwort überprüft nur HttpSession#isNew(). Dies schlägt jedoch offensichtlich fehl, wenn der Benutzer mehr als eine Anforderung in derselben Sitzung gesendet hat, wenn die Sitzung implizit von der JSP erstellt wird oder was nicht. Z.B. Wenn Sie einfach F5 auf der Anmeldeseite drücken.

Wie gesagt, sollten Sie stattdessen überprüfen, ob der Benutzer angemeldet ist oder nicht. Angesichts der Tatsache, dass Sie diese Art von Frage stellen, während Standardauthentifizierungs-Frameworks wie j_security_check, Shiro, Spring Security usw. dies bereits transparent verwalten (und es daher nicht erforderlich wäre, diese Art von Frage zu stellen) ), kann dies nur bedeuten, dass Sie einen selbst entwickelten Authentifizierungsansatz verwenden.

Angenommen, Sie speichern den angemeldeten Benutzer in der Sitzung in einem Login Servlet wie folgt:

@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);
        }
    }

}

Dann können Sie dies in einem Login überprüfen Filter wie folgt:

@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);
        }
    }

    // ...
}

Keine Notwendigkeit, mit spröden HttpSession#isNew() -Überprüfungen herumzuspielen.

18
BalusC

du kannst es auch mit einem Filter wie diesem machen:

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);
    }
}
}
8
kafrlust

Fügen Sie in den Filter dieses JavaScript ein, wodurch die Anmeldeseite wie folgt angezeigt wird. Wenn Sie dies nicht tun, erhalten Sie in Ihrem Aufruf AJAX) eine Anmeldeseite und der Inhalt der Anmeldeseite wird angehängt.

Fügen Sie in Ihren Filter oder Ihre Umleitung dieses Skript als Antwort ein:

String scr = "<script>window.location=\""+request.getContextPath()+"/login.do\"</script>";
response.getWriter().write(scr);
5
mukut

Auf Sitzung prüfen ist neu.

HttpSession session = request.getSession(false);
if (!session.isNew()) {
  // Session is valid
}
else {
  //Session has expired - redirect to login.jsp
}
5
zkarthik

Sie müssen die Schnittstelle HttpSessionListener implementieren, der Server benachrichtigt Sie über Sitzungs-Timeouts.

so was;

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");
  }
 }

Überprüfen Sie dieses Beispiel zum besseren Verständnis

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

4
Sunil Pidugu

Bis zum Sitzungs-Timeout erhalten wir eine normale Anfrage, nach der wir eine Ajax-Anfrage erhalten. Wir können es folgendermaßen identifizieren:

String ajaxRequestHeader = request.getHeader("X-Requested-With");
if ("XMLHttpRequest".equals(ajaxRequestHeader)) {
    response.sendRedirect("/login.jsp");
}
2
Anirudh Jadhav

ich habe diese mögliche Lösung gefunden:

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
LoGos