2013-11-15 2 views
3

특정 서블릿에 액세스 할 때 Jetty 서버가 세션의 마지막 액세스 시간을 업데이트하지 않도록 할 수 있습니까?Jetty에서 세션의 마지막 액세스 시간 업데이트 방지

우리의 유스 케이스는 백그라운드에서 비동기 요청을 5 분마다 보내어 내용을 새로 고치는 HTML 페이지입니다. 세션의 제한 시간은 30 분으로 설정됩니다. 이 구성의 불행한 문제는 사용자가 브라우저 탭에서 해당 페이지를 열어두면 세션의 액세스 시간이 모든 비동기 요청에 의해 업데이트되므로 세션이 만료되지 않는다는 것입니다.

정확성을 위해 나는 인터넷에서 내 문제에 대한 도움을 찾을 수 없어서 아직 아무 것도 시도하지 않았다는 것을 인정해야합니다. 내가 요구하는 것이 가능하지 않다면, 애플리케이션에 의해 직접 제어되는 세션 변수에 액세스 시간을 저장하려고 생각하고있다. 이 값은 요청이 처리되기 전에 (서블릿의 doGetdoPost 메소드에서) 일찌기 검사되어야하며 세션을 수동으로 무효화해야합니다. 더 나은 해결책이 있습니까?

답변

3

서블릿은 어떤 스크립트 나 사람이 요청을 생성했는지 여부를 구별 할 수 없습니다. 요청이 동일한 브라우저에서 왔기 때문에 결과적으로 동일한 JSESSIONID를 전송하기 때문입니다. 따라서 소스를 구별하기 위해 요청을 표시해야합니다. 헤더 나 요청 매개 변수로 표시 할 수 있습니다. 요청이 서블릿 컨테이너에 도착하면

if isUser(request){ 
    session.lastRobotAccess == null 
}else{ 
    if (session.lastRobotAccess == null) { 
     session.lastRobotAccess = current_time 
    } else { 
     if(current_time - session.lastRobotAccess > session.timeout){ 
      session.invalidate 
     } 
    } 
} 
이 처음이다

:

내가 세션의 변수에 액세스 시간을 저장하는 아이디어를 좋아 알고리즘이 경우에있을 것입니다 (이것은 서블릿 세션 만료에 편승 할 것) 필터에 의해 처리되고 (정의한 경우) 서블릿에 의해 처리됩니다. Filters are useful for :

필터에 대한 일반적인 시나리오는 서블릿의 그룹 , 단지 하나의 서블릿에 대한 요청이나 응답에 전처리 또는 후 처리를 적용하려는 것입니다. 하나의 서블릿에 대한 요청 또는 응답을 수정해야하는 경우 필터를 만들 필요가 없습니다. 서블릿 자체에 직접 필요한 것을 수행하십시오.

필터를 통해 세션에 도달 할 수 있으므로 논리에 더 적합한 장소입니다. 추가 검사를 통해 서블릿의 논리를 오염시키지 않으며 다른 서블릿에 적용 할 수 있습니다. 필터는 서블릿 사양의 일부이기 때문에 모든 컨테이너에서 작동합니다.

당신은 이미 이것들을 알고 있었지만, 나는 그것들을 "종이"에 두었습니다 :-D

+0

필터를 사용 해 주셔서 감사합니다. –

관련 문제