Сессия потеряна при переключении с https на http (tomcat 6.0.26) - PullRequest
1 голос
/ 16 февраля 2011

Я разрабатываю веб-приложение (jsf 2.0 + facelets + richfaces 3.3.3 + oracle 10g + tomcat 6.0.26)

в моем приложении есть 1 путь, который не защищен, а другие защищены (web.xml):

<login-config>
    <auth-method>FORM</auth-method>
    <form-login-config>
        <form-login-page>/faces/login.jsp</form-login-page>
        <form-error-page>/faces/error.jsp</form-error-page>
    </form-login-config>
</login-config>
<security-constraint>
    <web-resource-collection>
        <web-resource-name>Admin_Resource</web-resource-name>
        <description/>
        <url-pattern>/faces/admin/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>A</role-name>
    </auth-constraint>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>
<security-role>
    <description>Role admin</description>
    <role-name>A</role-name>
</security-role>

Итак, этот путь не защищен: / face / client / *. когда я перехожу из https tp http, я использую эту функцию:

FacesContext.getCurrentInstance().getExternalContext().redirect("http://url/faces/client/page.xhtml");

Когда я развернул свое приложение и использовал этот URL: http (s): // url / MyContext / Face / ..., все работало нормально.

Но когда я переместил свое приложение в контекст ROOT, поэтому я использую этот URL: http (s): // url / Faces /, мой сеанс https теряется при переходе с https на http, а затем обратно на https. Появляется моя страница входа в систему, поэтому мне нужно заново ввести логин и пароль.

Почему мой сеанс потерян? Что-то не так?

Добавить: при развертывании приложения вот что я делаю (внешний сервер):

  • положить мой военный файл в папку webapp

  • запустите мой сервер (который распакует мою войну в папки, ...), затем остановите его

  • я удаляю свой военный файл

  • я заменяю содержимое папки ROOT содержимым распакованного файла войны

  • и перезапустите мой сервер снова

но все работает нормально, когда я помещаю войну в папку webapp, затем запускаю сервер (и все).

Итак, я думаю, что это проблема контекста.

У вас есть идеи?

1 Ответ

0 голосов
/ 03 октября 2014

Это старый вопрос, но на него стоит ответить, потому что я просто наткнулся на него, и ответ оказался очень простым. Во-первых, имеет смысл, что сеанс должен быть заново создан с тем же именем файла cookie сеанса при переходе назад и вперед между HTTP и HTTPS. По умолчанию в Tomcat имя файла cookie сеанса - JSESSIONID.

В Tomcat вы можете очень просто изменить имя сеансового куки. У меня было два веб-приложения, один HTTP и другой HTTPS, для инструментов администратора. Каждый раз, когда открывалось веб-приложение HTTP, я терял сеанс в веб-приложении HTTPS. Все, что мне нужно было сделать, это добавить sessionCookieName в контекст моего веб-приложения HTTPS:

<context sessionCookieName="ANOTHERCOOKIENAME" ...

Это не поможет, если вы переключаетесь между HTTP и HTTPS в одном и том же веб-приложении, но вы все равно не должны этого делать.

...