Jak przekierować na stronę logowania po wygaśnięciu sesji w aplikacji Java web?

Uruchamiam aplikację webową w JBoss jako 5. Mam również filtr servlet, który przechwytuje wszystkie żądania do serwera. Teraz chcę przekierować użytkowników na stronę logowania, jeśli sesja wygasła. Muszę zrobić to' isSessionExpired () ' sprawdzić w filtrze i trzeba odpowiednio przekierować użytkownika. Jak to zrobić? Ustalam limit czasu sesji w sieci.xml, jak poniżej:

<session-config>
    <session-timeout>15</session-timeout>
</session-config>
Author: Joshua Taylor, 2009-06-22

9 answers

Możesz użyć filtra i wykonać następujący test:

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

Powyższy kod nie jest testowany .

Nie jest to jednak najbardziej rozbudowane rozwiązanie. Przed założeniem, że ponieważ sesja nie jest nowa, użytkownik musi się zalogować, należy sprawdzić, czy dany obiekt lub znacznik domeny jest dostępny w danej sesji. Bądź paranoikiem!
 52
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-11 08:08:55

jak przekierować na stronę logowania po wygaśnięciu sesji w aplikacji Java web?

To jest złe pytanie. Należy rozróżnić przypadki "Użytkownik nie jest zalogowany" i "sesja wygasła". W zasadzie chcesz przekierować na stronę logowania, gdy użytkownik nie jest zalogowany. Nie po wygaśnięciu sesji. Aktualnie akceptowana odpowiedź sprawdza tylko HttpSession#isNew(). Ale to oczywiście nie powiedzie się, gdy użytkownik wysłał więcej niż jedno żądanie w tej samej sesji, gdy sesja jest niejawnie tworzony przez JSP lub co nie. Np. po naciśnięciu klawisza F5 na stronie logowania.

Jak już wspomniano, powinieneś sprawdzić, czy użytkownik jest zalogowany, czy nie. Biorąc pod uwagę fakt, że zadajesz tego rodzaju pytania, podczas gdy standardowe frameworki uwierzytelniania, takie jak j_security_check, Shiro, Spring Security itp., już przejrzyście to zarządzają (i dlatego nie byłoby potrzeby zadawania tego rodzaju pytań na nich), może to oznaczać tylko, że używasz własnego podejścia do uwierzytelniania.

Zakładając, że zapisujesz zalogowanego użytkownika w sesji w jakimś loginie servlet Jak poniżej:

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

}

Następnie możesz to sprawdzić w filtrze logowania Jak poniżej:

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

    // ...
}

Nie trzeba bawić się kruchymi czekami HttpSession#isNew().

 16
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:45

Możesz to również zrobić z filtrem takim jak ten:

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

Resztę możesz zobaczyć w tym tutorialu

 8
Author: kafrlust,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-06 11:26:06

Sprawdzanie sesji jest nowe.

HttpSession session = request.getSession(false);
if (!session.isNew()) {
  // Session is valid
}
else {
  //Session has expired - redirect to login.jsp
}
 5
Author: zkarthik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-22 21:55:11

Wewnątrz filtra wprowadź Ten JavaScript, który spowoduje wyświetlenie strony logowania w ten sposób. Jeśli tego nie zrobisz, to w wywołaniu AJAX otrzymasz stronę logowania i zawartość strony logowania zostanie dołączona.

Wewnątrz filtra lub przekierowania Wstaw ten skrypt w odpowiedzi:

String scr = "<script>window.location=\""+request.getContextPath()+"/login.do\"</script>";
response.getWriter().write(scr);
 5
Author: mukut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-22 21:40:00

Musisz zaimplementować interfejs HttpSessionListener, serwer powiadomi o przerwach sesji.

Like this;

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

Sprawdź ten przykład dla lepszego zrozumienia

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

 2
Author: Sunil Pidugu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-16 06:18:37

Do czasu przekroczenia czasu sesji otrzymujemy zwykłe żądanie, po którym otrzymujemy żądanie Ajax. Możemy go zidentyfikować w następujący sposób:

String ajaxRequestHeader = request.getHeader("X-Requested-With");
if ("XMLHttpRequest".equals(ajaxRequestHeader)) {
    response.sendRedirect("/login.jsp");
}
 1
Author: Anirudh Jadhav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-19 06:48:27

Znalazłem takie rozwiązanie:

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
Author: LoGos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-17 07:07:14

Gdy loguje się użycie, należy umieścić jego nazwę użytkownika w sesji:

`session.setAttribute("USER", username);`

Na początku każdej strony możesz to zrobić:

<%
String username = (String)session.getAttribute("USER");
if(username==null) 
// if session is expired, forward it to login page
%>
<jsp:forward page="Login.jsp" />
<% { } %>
 -2
Author: sampath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-31 14:56:01