JSSESSionID는 jstl 태그에 의해 생성되는 모든 URL에서 발생합니다.

StackOverflow https://stackoverflow.com/questions/1045668

  •  20-08-2019
  •  | 
  •  

문제

이상한 버그가 있습니다 : 일부 브라우저에서 처음 페이지를 열면 모든 참조에는 jsessionid 매개 변수가 있습니다. <a href="/articles?name=art&jsessionid=5as45df4as5df"..>).

F5를 누르거나 다른 방식으로 페이지를 새로 고치면 모든 것이 사라지고 브라우저를 닫을 때까지 모든 것이 잘 작동합니다 (모든 탭도 닫아야합니다). 다시 열면이 이상한 jssessionid 매개 변수가 보입니다.

JSTL을 사용합니다 <c:url..> 모든 URL을 생성하기위한 태그.

쿠키가 비활성화 된 경우 jsessionid가 쿠키의 대안이지만 쿠키가 활성화되어 실제로 쿠키를 사용하지 않는다고 시간 전에 읽었습니다.

도움이 되었습니까?

해결책

이것은 버그가 아니라 디자인에 의한 것입니다. 새 세션이 만들어지면 서버는 클라이언트가 쿠키를 지원하는지 여부를 확신하지 못하므로 URL의 jssessionID뿐만 아니라 쿠키를 생성합니다. 클라이언트가 두 번째로 돌아와서 쿠키를 선물하면 서버는 jsessionID가 필요하지 않다는 것을 알고 나머지 세션에 대해 떨어 뜨립니다. 클라이언트가 쿠키없이 다시 돌아 오면 서버는 JSSessionID 재 작성을 계속 사용해야합니다.

쿠키를 명시 적으로 사용하지는 않지만 세션이 암시 적으로 있으므로 컨테이너는 해당 세션을 추적해야합니다.

다른 팁

설명 된 바와 같이 Skaffman의 대답, 버그가 아닙니다. 예상되는 행동입니다.

귀하의 질문에서 JSSESSIONID는 매개 변수로 추가됩니다.
사용
<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.

이 솔루션은입니다 컨테이너 독립 (Servlet Specification v3 호환 컨테이너 - Tomcat -Solution이 아닙니다). 응답 URL을 필터링하면 해킹과 같은 느낌이 들기 때문에 기본 동작을 변경해야합니다. 그러나 모두 당신이 필요로하고 달성하고자하는 것에 달려 있습니다.

Tomcat 7 또는 모든 서블릿 사양 v3 호환 서버에서 응용 프로그램의 web.xml에 다음을 추가하여 URL에서 jsessionid를 비활성화 할 수 있습니다.

<session-config>
    <tracking-mode>COOKIE</tracking-mode>
</session-config>

다음은 a의 맛의 불쾌한 해결 방법입니다 Filter 클라이언트가 쿠키를 지원할 때마다 URL에서 jsessionID를 볼 수 없도록합니다.

@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 패턴.

모든 페이지가 사용하는 공통 래퍼 페이지가 있다면 (나에게는 CONCEN.INC) 추가 할 수 있습니다. session="false" 너의 ~에게 <%@ page SessionID를 제거합니다.

예시 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 구성에 추가하여 SessionID를 자르기 위해이 정보를 추가 할 수 있습니다.

ReWriteRule ^/(\w+);jsessionid=\w+$ /$1 [L,R=301]
ReWriteRule ^/(\w+\.go);jsessionid=\w+$ /$1 [L,R=301]

불행히도 제가이 주변에서 찾은 유일한 방법은 jsessionid 매개 변수를 제거하는 응용 프로그램에 필터를 추가하는 것입니다. 공개 웹 사이트를 만들고 검색 엔진이 귀하의 페이지를 색인화하기를 원한다면 특히 성가신 일입니다.

나는 Tomcat (그것이 당신이 사용중인 경우)가 이것을 URL에 추가하지 않도록 구성 될 수 있다고 생각하지 않습니다. 그래도 다른 서버에 대해서는 말할 수 없습니다.

그러나 필터를 작성하고 세션 관리가 필요하고 사용자에게 쿠키가 꺼져 있으면 문제가 발생합니다.

하나의 해결 방법은 사용하지 않습니다 <c:url>, 그러나 사용합니다 ${request.contextPath}/path

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top