찾다

 >  Q&A  >  본문

java - Servlet 如何通过一般请求参数传递 SessionID

我有个项目,希望在 REST 接口使用 SessionID 作为 Token,这样能简化和用熟悉的方式处理会话数据,在 URL 附加 ;jsessionid= 太丑,传递 Cookie 的话 APP 开发又嫌麻烦,就想通过普通的 GET/POST 参数或自定义 HTTP BODY 来传递 SessionID。

现在的 Servlet 都不再支持通过 ID 获取 Session,搜到的一些方案,比如用监听器来记录 Session,但我不喜欢这种方式,1是我觉得冗余,2是不想自己存储更不想放在内存里;SessionManager 的话就是自定存储了,目前 tomcat,jetty 等的 session 已经满足我的需求了,没必要找这个麻烦。

我查了下 Tomcat 的源码找到了他的 Request 里有 setRequestedSessionId 的方法,只要在 getSession 之前调用就行,但这不是 ServletRequest 接口里的方法,我的项目不一定运行在 Tomcat 里。

来问问有什么简单的方式解决这个问题没?

天蓬老师天蓬老师2883일 전894

모든 응답(2)나는 대답할 것이다

  • 天蓬老师

    天蓬老师2017-04-17 17:59:18

    <… , Jetty에서 테스트한 후 작동하면 Tomcat을 사용해 보세요. 이 두 컨테이너는 제가 자주 사용하는 컨테이너인데, 다른 컨테이너를 만나면 꼭 확인해보도록 하겠습니다.

    코드는 간단합니다.

    으아악

    하하!

    현재 요청이 처음으로 getSession을 호출하기 전에 실행되어야 한다는 점에 유의해야 합니다. Session을 사용하는 상위 계층에 Filter가 있는지 특히 주의하세요


    2016/05/21 실험 결과 업데이트

    SessionID는 위의 방법으로 대체할 수 있으나, Session을 꺼낼 때 Session을 검증하고, Session 객체를 꺼낼 때 Jetty의 소스 코드를 추적하여 찾기 때문에 Session을 꺼낼 수 없습니다. 아래와 같이 요청이 초기화됩니다.

    현재는 Servlet과 Filter가 진행되지 않아 시작할 방법이 없어 초기화가 그리 간단하지 않은 것 같습니다.

    위 내용은 Jetty에서만 테스트한 결과 실패했습니다. Tomcat에 대한 실험은 없습니다. 소스 코드를 보면changeSessionId(String) 메소드가 로직에 따라 가능해야 합니다.


    2016년 5월 21일에 결과가 다시 업데이트되었습니다

    계속해서 던진 후 다음 코드를 사용하여 sessionId가 성공적으로 재설정되었습니다.

    으아악

    이후 실행되는 프로그램에서는 아무것도 변경할 필요가 없습니다. request.getSession()을 사용하면 정상적으로 Session을 읽고 쓸 수 있습니다.


    2015/05/22 Tomcat 실제 측정 업데이트

    아침 식사 후 심심해서 Tomcat 7, 8 버전을 사용하여 Tomcat 코드를 추적해 본 결과 사용자 Servlet에 전달된 Request 객체가 RequestFacade라는 프록시 클래스라는 것을 발견했습니다. 이는 HttpServletRequest의 메서드에서만 작동합니다. 구현이 없으면 해당 Request 객체가 숨겨지므로 setRequestedSessionId 및 org.apache.catalina.connector.Request의 다른 메서드를 호출할 수 없습니다.

    이 Hack은 Jetty에만 구현할 수 있는 것 같습니다.


    결과가 낙관적이지 않고 Jetty가 향후 버전에서 이러한 메서드를 숨길 수도 있지만, 이 실험 프로세스를 통해 우리는 이 두 애플리케이션 컨테이너를 더 잘 이해할 수 있게 되었습니다. 쿠키, URL 경로 매개변수, GET/POST 매개변수 등 요청 데이터의 다양한 위치에 세션 토큰을 전달하기만 하면 클라이언트 측에서 연결을 캡슐화하는 것이 더 편리할 수 있습니다.

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-17 17:59:18

    토큰을 사용하여 요청 헤더에 토큰을 넣으세요. 프런트엔드는 요청 시 이 토큰을 가져와야 합니다

    회신하다
    0
  • 취소회신하다