@Override protected RequestTrackingHostValve createRequestTrackingHostValve(final String sessionCookieName, final CurrentRequest currentRequest) { final RequestTrackingHostValve result = super.createRequestTrackingHostValve(sessionCookieName, currentRequest); result.setAsyncSupported(true); return result; } };
final String requestId = getURIWithQueryString( request ); if(!_enabled.get() || !_msmContext.equals(request.getContext())) { getNext().invoke( request, response ); } else if ( _ignorePattern != null && _ignorePattern.matcher( requestId ).matches() ) { if(_log.isDebugEnabled()) { storeRequestThreadLocal( request ); request.setNote(REQUEST_IGNORED, Boolean.TRUE); getNext().invoke( request, response ); } finally { if(request.getNote(REQUEST_PROCESSED) == Boolean.TRUE) { final String sessionId = getSessionId(request, response); if(sessionId != null) { _sessionBackupService.requestFinished(sessionId, requestId); resetRequestThreadLocal(); storeRequestThreadLocal( request ); getNext().invoke( request, response ); } finally { final Boolean sessionIdChanged = (Boolean) request.getNote(SESSION_ID_CHANGED); backupSession( request, response, sessionIdChanged == null ? false : sessionIdChanged.booleanValue() ); resetRequestThreadLocal(); logDebugRequestSessionCookie( request ); logDebugResponseCookie( response ); _log.debug( "<<<<<< Request finished: " + requestId + " ==================" );
private String getSessionId(final Request request, final Response response) { // If the context is configured with cookie="false" there's no session cookie // sent so we must rely on data from MemcachedSessionService String sessionId = (String) request.getNote(MemcachedSessionService.NEW_SESSION_ID); if(sessionId == null) { sessionId = getSessionIdFromResponseSessionCookie( response ); } return sessionId != null ? sessionId : request.getRequestedSessionId(); }
private void backupSession( final Request request, final Response response, final boolean sessionIdChanged ) { /* * Do we have a session? */ final String sessionId = getSessionId(request, response); if ( sessionId != null ) { _statistics.requestWithSession(); _sessionBackupService.backupSession( sessionId, sessionIdChanged, getURIWithQueryString( request ) ); } else { _statistics.requestWithoutSession(); } }
_service.getTrackingHostValve().storeRequestThreadLocal(requestMock); _service.getTrackingHostValve().resetRequestThreadLocal(); assertEquals(result.get().getStatus(), BackupResultStatus.SKIPPED);
@Test public final void testBackupSessionInvokedWhenResponseCookiePresent() throws IOException, ServletException { when( _request.getRequestedSessionId() ).thenReturn( null ); final Cookie cookie = new Cookie( _sessionTrackerValve.getSessionCookieName(), "foo" ); setupGetResponseSetCookieHeadersExpectations(_response, new String[]{generateCookieString( cookie )}); _sessionTrackerValve.invoke( _request, _response ); verify( _service ).backupSession( eq( "foo" ), eq( false), anyString() ); }
@Test public void testInvalidNonStickySessionDoesNotCallOnBackupWithoutLoadedSessionIssue137() throws Exception { _service.setStickyInternal( false ); _service.setLockingMode( LockingMode.NONE, null, false ); _service.startInternal(new MemcachedStorageClient(_memcachedMock)); // we must put in our mock again final String sessionId = "nonStickySessionToTimeOut-n1"; // For findSession needed final Request requestMock = mock(Request.class); when(requestMock.getNote(eq(RequestTrackingContextValve.INVOKED))).thenReturn(Boolean.TRUE); _service.getTrackingHostValve().storeRequestThreadLocal(requestMock); final MemcachedBackupSession session = _service.findSession(sessionId); assertNull(session); _service.backupSession( sessionId, false, null ).get(); // check that validity info is not loaded - this would trigger the // WARNING: Found no validity info for session id ... final String validityKey = new SessionIdFormat().createValidityInfoKeyName( sessionId ); verify( _memcachedMock, times( 0 ) ).get( eq( validityKey ) ); }
@Override public BackupResult call() throws Exception { final MemcachedBackupSession session3 = _service.findSession(session.getId()); assertSame(session3, session2); assertEquals(session3.getRefCount(), 2); // let the other thread proceed (or wait) barrier.await(); // and wait again so that the other thread can do some work barrier.await(); final Future<BackupResult> result = _service.backupSession(session.getId(), false, "unused"); _service.getTrackingHostValve().resetRequestThreadLocal(); assertEquals(result.get().getStatus(), BackupResultStatus.SUCCESS); // The session should be released now and no longer stored assertFalse(_service.getManager().getSessionsInternal().containsKey(session.getId())); // just some double checking on expectations... assertEquals(session2.getRefCount(), 0); return result.get(); }
private void logDebugResponseCookie( final Response response ) { final String[] headers = getSetCookieHeaders(response); if ( headers != null ) { for (final String header : headers) { if (header != null && header.contains(_sessionCookieName)) { _log.debug( "Request finished, with Set-Cookie header: " + header ); } } } }
@Test public final void testGetSessionCookieName() throws IOException, ServletException { final RequestTrackingHostValve cut = new RequestTrackingHostValve(null, "foo", _service, Statistics.create(), new AtomicBoolean( true ), new CurrentRequest()) { @Override protected String[] getSetCookieHeaders(final Response response) { final Collection<String> result = response.getHeaders("Set-Cookie"); return result.toArray(new String[result.size()]); } }; assertEquals(cut.getSessionCookieName(), "foo"); }
@Test public final void testChangeSessionIdForRelocatedSession() throws IOException, ServletException { final String sessionId = "bar"; final String newSessionId = "newId"; when(_request.getNote(eq(RequestTrackingHostValve.SESSION_ID_CHANGED))).thenReturn(Boolean.TRUE); when( _request.getRequestedSessionId() ).thenReturn( sessionId ); final Cookie cookie = new Cookie( _sessionTrackerValve.getSessionCookieName(), newSessionId ); setupGetResponseSetCookieHeadersExpectations(_response, new String[]{generateCookieString( cookie )}); _sessionTrackerValve.invoke( _request, _response ); verify( _service ).backupSession( eq( newSessionId ), eq( true ), anyString() ); }
private void backupSession( final Request request, final Response response, final boolean sessionIdChanged ) { /* * Do we have a session? */ final String sessionId = getSessionId(request, response); if ( sessionId != null ) { _statistics.requestWithSession(); _sessionBackupService.backupSession( sessionId, sessionIdChanged, getURIWithQueryString( request ) ); } else { _statistics.requestWithoutSession(); } }
private String getSessionIdFromResponseSessionCookie(final Response response) { final String[] headers = getSetCookieHeaders(response); if (headers == null) { return null;
final String requestId = getURIWithQueryString( request ); if(!_enabled.get() || !_msmContext.equals(request.getContext())) { getNext().invoke( request, response ); } else if ( _ignorePattern != null && _ignorePattern.matcher( requestId ).matches() ) { if(_log.isDebugEnabled()) { storeRequestThreadLocal( request ); request.setNote(REQUEST_IGNORED, Boolean.TRUE); getNext().invoke( request, response ); } finally { if(request.getNote(REQUEST_PROCESSED) == Boolean.TRUE) { final String sessionId = getSessionId(request, response); if(sessionId != null) { _sessionBackupService.requestFinished(sessionId, requestId); resetRequestThreadLocal(); storeRequestThreadLocal( request ); getNext().invoke( request, response ); } finally { final Boolean sessionIdChanged = (Boolean) request.getNote(SESSION_ID_CHANGED); backupSession( request, response, sessionIdChanged == null ? false : sessionIdChanged.booleanValue() ); resetRequestThreadLocal(); logDebugRequestSessionCookie( request ); logDebugResponseCookie( response ); _log.debug( "<<<<<< Request finished: " + requestId + " ==================" );
@Override protected RequestTrackingHostValve createRequestTrackingHostValve(final String sessionCookieName, final CurrentRequest currentRequest) { final RequestTrackingHostValve result = super.createRequestTrackingHostValve(sessionCookieName, currentRequest); result.setAsyncSupported(true); return result; } };
private void logDebugResponseCookie( final Response response ) { final String[] headers = getSetCookieHeaders(response); if ( headers != null ) { for (final String header : headers) { if (header != null && header.contains(_sessionCookieName)) { _log.debug( "Request finished, with Set-Cookie header: " + header ); } } } }
private String getSessionId(final Request request, final Response response) { // If the context is configured with cookie="false" there's no session cookie // sent so we must rely on data from MemcachedSessionService String sessionId = (String) request.getNote(MemcachedSessionService.NEW_SESSION_ID); if(sessionId == null) { sessionId = getSessionIdFromResponseSessionCookie( response ); } return sessionId != null ? sessionId : request.getRequestedSessionId(); }
@Override protected RequestTrackingHostValve createRequestTrackingHostValve(final String sessionCookieName, final CurrentRequest currentRequest) { final RequestTrackingHostValve result = super.createRequestTrackingHostValve(sessionCookieName, currentRequest); result.setAsyncSupported(true); return result; } };
private String getSessionIdFromResponseSessionCookie(final Response response) { final String[] headers = getSetCookieHeaders(response); if (headers == null) { return null;
@Override protected RequestTrackingHostValve createRequestTrackingHostValve(final String sessionCookieName, final CurrentRequest currentRequest) { final RequestTrackingHostValve result = super.createRequestTrackingHostValve(sessionCookieName, currentRequest); result.setAsyncSupported(true); return result; } };