Передача переменных сеанса из jsp в фильтр сервлета - PullRequest
0 голосов
/ 08 сентября 2011

Я только что написал свой первый фильтр сервлетов, и у меня уже есть проблемы. Я хотел сделать так, чтобы фильтр обрабатывал аутентификацию так, чтобы, если запрашивалась защищенная страница, фильтр включался и перенаправлялся на страницу входа. Если вход выполнен успешно, фильтр перенаправит пользователя на запрошенную исходную страницу.

Чтобы привести пример, одной из рассматриваемых страниц является страница блога. Когда пользователь нажимает «Оставить комментарий», он перенаправляется фильтром на страницу входа, если он еще не вошел в систему. До этого момента фильтр выполняет свою работу. Затем пользователь входит в систему и проверяется имя пользователя / пароль. Если они в порядке, переменная сеанса устанавливается в jsp, и страница снова перенаправляется на страницу комментариев. Этот запрос проходит через фильтр, где я проверяю переменную сеанса. Но несмотря ни на что, сессия, которую я получаю по запросу, кажется новой, без установленных атрибутов. Я попытался вызвать request.getSession (false), и это всегда возвращает null. Так что не возвращайте мне тот же сеанс, что и мои страницы jsp.

Я использую Tomcat 7.0.2. Я не знаю, является ли это специфическим для котов или есть какая-то очень очевидная вещь, по которой я скучаю.

Надеюсь, ты не поможешь мне.

Gisli

- Обновление -

Вот мой код. Угадай, это было бы весьма полезно:).

По сути, у меня есть страница входа, страница блога и страница комментариев. На странице блога у меня есть эта ссылка:

<a href="?page=blogg/komment.jsp?id=<%=blog.getID()%>"> Leave comment </a>

В моем фильтре у меня есть это:

public void doFilter(ServletRequest req, ServletResponse res,
        FilterChain chain) throws IOException, ServletException {
    // TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse)res;
HttpSession session = request.getSession(false);

Object userObj = null;
if( session != null ) {
    userObj = session.getAttribute( "username" );
}
String contextPath = request.getContextPath();
String queryString = request.getQueryString();
String url = request.getRequestURI();

String page = request.getParameter("page");

String user = "<user>";
if( userObj != null )
    user = userObj.toString();

if( page == null )
    page = "<page>";

if( userObj == null && page.indexOf( "blogg/komment.jsp" ) != -1 ) {
    session.setAttribute( "destPage", page );
    response.sendRedirect( "index.jsp?page=blogg/login.jsp" );
}

System.out.println( ", Time "
                    + new Date().toString() + " " + page + " " + user);

chain.doFilter(req, res);
}

Пока все хорошо. Это перенаправляет меня на страницу входа. Там я делаю это:

    String user = request.getParameter( "username" );
    String pass = request.getParameter( "password" );

    if( blog.confirmUser( user, pass ) ) {
      session.setAttribute( "username", user );
      Object destPageObj = session.getAttribute( "destPage" );
      String destPage = "xxx";
      if( destPageObj != null )
          destPage = destPageObj.toString();
      response.sendRedirect( "index.jsp?page=" + destPage );

      %>
      User exists
<%
    }
    else {
%>
    User does not exist
<%
    }

Строка «Пользователь существует» никогда не должна быть распечатана, но она всегда появляется, и я получаю страницу входа обратно.

Это то, чего я не понимаю. Я установил переменную сеанса "username", чтобы при следующем обращении к фильтру эта переменная содержала значение. Но это всегда кажется пустым. Фактически, когда я вызывал getSession (false) в фильтре, я всегда возвращал null. Даже если предполагается, что переменная сеанса всегда существует в JSP, если она еще не истекла.

Я попытался передать переменные сеанса между страницами, и это прекрасно работает. Но установить переменную сеанса на странице и прочитать ее в следующем редиректе всегда не удается.

Я чувствую, что есть что-то ужасно очевидное, что смотрит мне в лицо, и я просто слишком долго над этим работал, чтобы это увидеть!

Надеюсь, вы, ребята, можете помочь!

- дальнейшее обновление -

Слишком мало места для записи в качестве комментария :). То, что я хочу сделать, это. Я хотел сделать мои страницы JSP независимыми от страницы входа. То есть Я хотел, чтобы фильтр действовал как посредник. Поэтому, когда я отправляю пользователя на свою страницу комментариев, мне не нужно беспокоиться о том, вошел он в систему или нет. Если он не вошел в систему, фильтр должен перенаправить его на страницу входа, а затем отправить его в исходное место назначения. Мой блог - не единственное, что требует аутентификации, и я хотел, чтобы эта логика была в одном месте.

Я не хочу передавать имя пользователя / пароль в качестве параметров запроса по соображениям безопасности. Я хочу, чтобы оба остались в качестве атрибутов сеанса.

Я не понимаю, что вы имеете в виду, когда говорите, что то, что я делаю на странице входа, должно быть сделано в фильтре. Мне нужна страница, чтобы попросить пользователя ввести его имя пользователя и пароль, и я не хочу отправлять их вместе с запросом. Я видел пример здесь, ссылка , который именно то, что я хочу сделать. За исключением того, что это не работает по какой-то причине, потому что я не могу получить доступ к тому же сеансу, где я сохранил имя пользователя.

Если я полностью ошибся, не могли бы вы указать мне на веб-страницу, где это делается правильно? Я часами гуглял, и все, что я нашел, это примеры, которые, кажется, работают для всех, кроме меня :).

1 Ответ

1 голос
/ 19 сентября 2011

Я решил это после долгих поисков и поисков.

Одна вещь, которую я не смог упомянуть, это то, что у меня Tomcat работает за прокси-сервером. И прокси не доставлял сессионный cookie. В моем определении виртуального хоста у меня было это:

    <IfModule proxy_module>
        ProxyRequests Off 
        ProxyPass / http://b6.is:8080/B6/
        ProxyPassReverse / http://b6.is:8080/B6/
    </IfModule>

Итак, все передается в веб-приложение B6 из корня.

Все, что мне также нужно было сделать, чтобы перевести путь к файлам cookie, это добавить эту строку:

        ProxyPassReverseCookiePath  /B6 /

Теперь все работает отлично.

...