Как перенаправить на страницу входа, когда сеанс истек в веб-приложении Java?

Я запускаю веб-приложение в JBoss AS 5. У меня также есть фильтр сервлетов, который перехватывает все запросы к серверу. Теперь я хочу перенаправить пользователей на страницу входа, если сеанс истек. Мне нужно сделать это "isSessionExpired ()" Проверьте в фильтре и необходимо перенаправить пользователя соответственно. Как мне это сделать? Я устанавливаю ограничение по времени сеанса в файле web.xml, как показано ниже:

<code><session-config>
    <session-timeout>15</session-timeout>
</session-config>
</code>
 Mr_and_Mrs_D24 сент. 2012 г., 23:06
Почему бы не использовать SessionListener и перенаправить на уничтоженный сеанс?
 BalusC17 сент. 2015 г., 11:40
@Mr_and_Mrs_D: потому что необязательно HTTP-запрос, доступный во время уничтожения сеанса.

Ответы на вопрос(9)

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

вы можете увидеть остальное в этомруководство

 05 февр. 2019 г., 16:39
Может быть, хотите дважды проверить ссылку на этот учебник ...
 17 апр. 2015 г., 08:40
Это также может вызвать исключение NULL-указателя при попытке прочитать атрибут, если getSession возвращает null.
 04 авг. 2015 г., 04:46
Также у вас могут быть страницы, на которых пользователь не вошел в систему. То есть страницы регистрации, где вы не получите никакой роли.
Решение Вопроса

Фильтр и сделайте следующий тест:

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

The above code is untested.

Однако это не самое обширное решение. Вы также должны проверить, что некоторый предметный объект или флаг доступны в сеансе, прежде чем предполагать, что, поскольку сеанс не является новым, пользователь должен войти в систему.Be paranoid!

 09 окт. 2015 г., 23:41
как это «цепочка» установить над этим кодом?
 19 окт. 2016 г., 12:53
@MacGyver цепочка является объектом класса FilterChain, который присутствует в методе doFilter.
 11 окт. 2015 г., 10:16
Да, это правда. Это был бы третий аргумент (передаваемое значение) для необязательного третьего параметра (для определения метода) в методе, но doFilter - это метод объекта & quot; chain & quot; в вашем коде. Где "цепочка" установить выше этой строки кода в вашем исходном коде?
 11 окт. 2015 г., 10:44
Я не знаю, на что вы ссылаетесь в отношении необязательных 3-х параметров.chain переменная передается в вашу реализациюdoFilter, контейнером. В этом ответе подразумевается, что код находится внутриdoFilter.

после чего получаем запрос Ajax. Мы можем определить это следующим образом:

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

HttpSession session = request.getSession(false);
if (!session.isNew()) {
  // Session is valid
}
else {
  //Session has expired - redirect to login.jsp
}
 26 дек. 2014 г., 09:36
@zkarthik Исключение Nullpointer в случае тайм-аута сеанса & quot; если бы это было так просто & quot; as null.isNew () будет происходить, когда сессия равна нулю, что вызовет исключение
 12 сент. 2012 г., 23:06
session != null && !session.isNew() должно работать хотя;)
 11 окт. 2011 г., 16:56
Ваш фрагмент подвержен исключениям нулевого указателя. Передача ложногоgetSession не будет создавать сеанс, если он не существует, и поэтому будет возвращать ноль.
 03 февр. 2014 г., 14:39
@Yeti, тогда зачем вообще проверять isNew (), если мы можем сделать то же самое с одной нулевой проверкой !! :)

HttpSessionListener Интерфейс, сервер будет уведомлять время ожидания сеанса.

как это;

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

Проверьте этот пример для лучшего понимания

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

введите его имя пользователя в сеанс:

`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" />
<% { } %>
 31 дек. 2011 г., 21:46
Код с копией не СУХОЙ. Используйте фильтр. Смотрите такжеstackoverflow.com/questions/3177733/…
 25 авг. 2013 г., 02:44
Совершенно отвратительное решение!

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

How to redirect to Login page when Session is expired in Java web application?

Это неправильный вопрос. Вы должны различать случаи "Пользователь не вошел в систему" и "Сеанс истек". Вы в основном хотите перенаправить на страницу входа, когда пользователь не вошел в систему. Не, когда сеанс истек. В настоящее время принят только ответ проверяетHttpSession#isNew(), Но это, очевидно, дает сбой, когда пользователь отправил более одного запроса в одном сеансе, когда сеанс неявно создается JSP или нет. Например. когда просто нажимаешь F5 на странице входа.

Как уже говорилось, вы должны вместо этого проверять, вошел ли пользователь в систему или нет. Учитывая тот факт, что вы задаете такой вопрос, в то время как стандартные платформы аутентификации, такие какj_security_checkShiro, Spring Security и т. Д. Уже прозрачно управляют этим (и, следовательно, нет необходимости задавать им подобные вопросы), что может означать только то, что вы используете доморощенный подход к аутентификации.

Предполагая, что вы сохраняете зарегистрированного пользователя в сеансе при некотором входе в системусервлет как ниже:

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

}

Тогда вы можете проверить это в логинефильтр как ниже:

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

    // ...
}

Нет необходимости возиться с хрупкимHttpSession#isNew() чеки.

который выведет страницу входа в систему следующим образом. Если вы этого не сделаете, то при вызове AJAX вы получите страницу входа и добавлено содержимое страницы входа.

Внутри вашего фильтра или перенаправления вставьте этот скрипт в ответ:

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

Ваш ответ на вопрос