jsessionid는 쿠키입니다. URL 뒤에 ";jsessionid=xxx"를 추가하면 서블릿 컨테이너가 사용자 세션을 기록하는 데 사용됩니다. 사용자의 세션에 액세스합니다.
먼저 JSESSIONID는 서블릿 컨테이너(tomcat, jetty)에서 사용자 세션을 기록하는 데 사용되는 쿠키입니다.
JSESSIONID를 심을 때
세션을 생성할 때, 즉 request.getSession()이 호출될 때 getSession에 대해서는 언급하지 않겠습니다. 몇 가지 추가 사항은 JSP 페이지에 액세스하면 기본적으로 세션이 생성되지 않는다는 것입니다.
JSESSIONID 작동 원리:
URL이 많습니다. 쓰기
서버는 메모리에 세션을 생성하고 쿠키가 필요합니다. 요청 헤더에 Set-Cookie를 설정하는 것 외에도 tomcat과 같은 컨테이너에는 URL 재작성 메커니즘이 있습니다. 이 메커니즘은 클라이언트 쿠키를 사용할 수 없을 때의 은폐 전략입니다. URL 뒤에;jsessionid=xxx를 추가하면 세션 ID가 전달되므로 쿠키를 사용할 수 없는 경우에도 세션의 가용성을 보장할 수 있습니다. 세션 자체가 URL에 노출되므로 안전하지 않습니다. 그러나 가장 중요한 질문은 tomcat이 클라이언트 쿠키를 사용할 수 없다는 것을 어떻게 알 수 있느냐는 것입니다. 아이디어에서 Tomcat의 소스 코드 디버깅 추적을 가져왔습니다. 버전마다 약간의 차이가 있지만 대략 동일해야 합니다. Tomcat에는 Response의 구현 클래스인 org.apache.catalina.connector.Response가 있습니다. URL 재작성을 위한 두 가지 방법은 각각 encodeRedirectURL과 encodeURL입니다. 리디렉션할 때 encodeRedirectURL이 호출되고, encodeURL은 수동으로 호출되는 것으로 보이므로 기본적으로 URL 재작성은 리디렉션할 때만 발생합니다. 두 메서드의 코드는 유사합니다. 다음은 encodeRedirectURL
/** * Encode the session identifier associated with this response * into the specified redirect URL, if necessary. * * @param url URL to be encoded * @return <code>true</code> if the URL was encoded */ @Override public String encodeRedirectURL(String url) { if (isEncodeable(toAbsolute(url))) { return (toEncoded(url, request.getSessionInternal().getIdInternal())); } else { return (url); } }
에만 중점을 둡니다. 메서드 설명은 명확하게 작성됩니다. 필요한 경우 리디렉션된 URL에 세션 ID를 삽입합니다. isEncodeable 메소드를 다시 살펴보겠습니다. 클라이언트 쿠키의 사용 가능 여부를 확인하기 위해 Request 객체의 isRequestedSessionIdFromCookie를 호출하는
/** * Return <code>true</code> if the specified URL should be encoded with * a session identifier. This will be true if all of the following * conditions are met: * <ul> * <li>The request we are responding to asked for a valid session * <li>The requested session ID was not received via a cookie * <li>The specified URL points back to somewhere within the web * application that is responding to this request * </ul> * * @param location Absolute URL to be validated * @return <code>true</code> if the URL should be encoded */ protected boolean isEncodeable(final String location) { if (location == null) { return false; } // Is this an intra-document reference? if (location.startsWith("#")) { return false; } // Are we in a valid session that is not using cookies? final Request hreq = request; final Session session = hreq.getSessionInternal(false); if (session == null) { return false; } //这里其实就是网上说的客户端禁用Cookie if (hreq.isRequestedSessionIdFromCookie()) { return false; } // Is URL encoding permitted // servlet3.0后可以在项目web.xml里关掉URL重写,对应tomat7之后 if (!hreq.getServletContext().getEffectiveSessionTrackingModes(). contains(SessionTrackingMode.URL)) { return false; } if (SecurityUtil.isPackageProtectionEnabled()) { return ( AccessController.doPrivileged(new PrivilegedAction<Boolean>() { @Override public Boolean run(){ return Boolean.valueOf(doIsEncodeable(hreq, session, location)); } })).booleanValue(); } else { //这个方法会重写URL return doIsEncodeable(hreq, session, location); } }
에 중국어 주석을 추가했습니다. 요청에 JSESSIONID 쿠키가 전달되었는지 여부를 읽습니다. 그래서 인터넷에서 어떤 분들은 처음 방문하신다고 하십니다. 사실 클라이언트가 JSESSIONID를 전달하지 않는 한 Tomcat은 쿠키를 사용할 수 없는 것으로 가정합니다
위 내용은 jsessionid가 뭐야?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!