jsessionid встречается во всех URL, которые генерируются тегом jstl <c: url ..> - PullRequest
30 голосов
/ 25 июня 2009

У меня странная ошибка: при первом открытии страницы в каком-либо браузере все ссылки имеют параметр jsessionid (например, <a href="/articles?name=art&jsessionid=5as45df4as5df"..>).

Когда я нажимаю клавишу F5 или обновляю страницу любым другим способом, все это исчезает, и все работает нормально, пока я не закрою свой браузер (и все вкладки тоже должны быть закрыты). Когда я снова открываю его, я вижу этот странный параметр jsessionid.

Я использую тег jstl <c:url..> для создания всех URL.

Некоторое время назад я читал, что jsessionid является альтернативой cookie-файлам, если cookie-файлы отключены, но cookie-файлы включены, а я фактически не использую cookie-файлы.

Ответы [ 7 ]

39 голосов
/ 25 июня 2009

Это не ошибка, это дизайн. Когда создается новый сеанс, сервер не уверен, поддерживает ли клиент куки или нет, и поэтому он генерирует куки, а также jsessionid в URL. Когда клиент возвращается во второй раз и представляет файл cookie, сервер знает, что jsessionid не нужен, и отбрасывает его до конца сеанса. Если клиент возвращается без файла cookie, то сервер должен продолжать использовать переписывание jsessionid.

Вы не можете явно использовать куки, но у вас есть неявный сеанс, и контейнер должен отслеживать этот сеанс.

26 голосов
/ 21 июня 2012

Как объяснено в ответ Скаффмана , , это не ошибка. Это ожидаемое поведение .

В вашем вопросе jsessionid добавляется как параметр, а это не так.
Использование
<c:url value="/"/>
сгенерирует что-то вроде следующего: /some/;jsessionid=E85FAC04E331FFCA55549B10B7C7A4FA.
Таким образом, используя
<link href="<c:url value="/"/>stylesheets/style.css" rel="stylesheet" type="text/css"/>
сгенерирует
/some/;jsessionid=E85FAC04E331FFCA55549B10B7C7A4FAstylesheets/style.css
поэтому ваш сервер не может найти доступный ресурс.

Лучший обходной путь, который я нашел, это использовать ${pageContext.request.contextPath} вместо <c:url value="/"/>. Так что в предыдущем примере вы получили бы
<link href="${pageContext.request.contextPath}/stylesheets/style.css" rel="stylesheet" type="text/css"/>
который будет генерировать
/some/stylesheets/style.css.

Это решение не зависит от контейнера (тогда как решение для сервлета, совместимого со спецификацией v3 - как Tomcat, - нет). Фильтрация URL-адреса ответа выглядит как хак, потому что вам нужно изменить поведение по умолчанию. Но все зависит от того, что вам нужно и чего вы хотите достичь.

14 голосов
/ 08 февраля 2012

На сервере Tomcat 7 или любом сервере, совместимом со спецификацией сервлета v3, вы можете отключить jsessionid в URL, добавив следующий текст в файл web.xml вашего приложения

<session-config>
    <tracking-mode>COOKIE</tracking-mode>
</session-config>
5 голосов
/ 26 октября 2010

Вот неприятный обходной путь Filter, так что вы никогда не увидите jsessionid в URL, когда клиент поддерживает куки.

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;
    HttpSession session = req.getSession();

    if (session.isNew()) {
        // New session? OK, redirect to encoded URL with jsessionid in it (and implicitly also set cookie).
        res.sendRedirect(res.encodeRedirectURL(req.getRequestURI()));
        return;
    } else if (session.getAttribute("verified") == null) {
        // Session has not been verified yet? OK, mark it verified so that we don't need to repeat this.
        session.setAttribute("verified", true);
        if (req.isRequestedSessionIdFromCookie()) {
            // Supports cookies? OK, redirect to unencoded URL to get rid of jsessionid in URL.
            res.sendRedirect(req.getRequestURI().split(";")[0]);
            return;
        }
    }

    chain.doFilter(request, response);
}

Сопоставьте его с /* или любым другим шаблоном URL, который требует управления сеансом.

2 голосов
/ 18 февраля 2015

Если у вас есть общая страница-обертка, которую используют все страницы (для меня это было обычным .inc) Вы можете добавить session="false" к вашему <%@ page, чтобы удалить идентификатор сессии.

Пример common.inc

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="false" trimDirectiveWhitespaces="true" %>
<%@ taglib prefix="ab" tagdir="/WEB-INF/tags" %>

<c:set var="contextPath" scope="request" value="${ pageContext.request.contextPath }" />
<c:set var="assetPath" scope="request" value="/assets" />
<c:set var="debugEnabled" scope="request" value="${ applicationDebugProperties.debugEnabled }" />

В качестве альтернативы .. установите значение c:url для переменной и используйте c:out escapeXml="false" для вывода переменной, и это удалит sessionid.

Пример:

<c:url value=${url} var="image"/>
<c:out var=${image} escapeXml="false"/>

В качестве альтернативы, вы можете добавить это в вашу конфигурацию Apache для усечения идентификатора сеанса.

ReWriteRule ^/(\w+);jsessionid=\w+$ /$1 [L,R=301]
ReWriteRule ^/(\w+\.go);jsessionid=\w+$ /$1 [L,R=301]
0 голосов
/ 25 октября 2010

Один из способов - не использовать <c:url>, а использовать ${request.contextPath}/path

0 голосов
/ 25 июня 2009

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

Я не верю, что tomcat (если это то, что вы используете) можно настроить так, чтобы он не добавлялся в ваш URL. Я не могу сказать о других серверах.

Однако учтите, что если вы создадите фильтр и вам потребуется управление сеансом, а у пользователя отключены файлы cookie, у вас возникнут проблемы.

...