Сессии Coldfusion - как точно CF идентифицирует соединение / уникальный клиент - PullRequest
5 голосов
/ 27 июня 2011

Сеансы Coldfusion - как точно CF идентифицирует соединение / уникальный клиент

После некоторого копания с удаленными CFC, которые я вызывал из Word VBA, я обнаружил, что они также устанавливают сеансы.Что заставило меня задуматься и поискать в Google (безуспешно) объяснение того, как CF различает разных клиентов.Ранее я предполагал, что это cookie-файл браузера, устанавливаемый для идентификации клиента, но затем здесь я использовал веб-сервис через приложение word и все еще получал переменные сеанса и набор sessionID.

Так что, если я загружу ивойти в мое приложение через браузер (chrome) и перейти на тестовую страницу, я получаю jsessionID = 123, если я запускаю firefox и вход в систему, я получаю другой jsessionid = 234, как и ожидалось.Если я запускаю удаленный cfc как веб-службу wsdl с помощью Word VBA, я вижу, что jsessionid = 345 возвращается в модуль VBA.Если я закрою Word и снова открою свой макрос (содержащий запрос на вход в веб-службу), я получу новый jsessionID = 567

Так что же такое запрос, который идентифицирует CF, и как он сохраняет идентификациюклиент?

Это та же проблема в http-вызове VBA

 Sub doHTTP()

Dim MyRequest As Object
Dim Val
httpString = "http://localhost:8888/test.cfm"

Set MyRequest = CreateObject("WinHttp.WinHttpRequest.5.1")

MyRequest.Open "GET", httpString

' Send Request.
MyRequest.Send

MsgBox MyRequest.ResponseText

'now pass in the session urltoken we have just retreived

MyRequest.Open "GET", httpString & "?urltoken=" & MyRequest.ResponseText

' resend a request, this time with the urltoken.
MyRequest.Send

'take a look and see if the session variables are correct
MsgBox MyRequest.ResponseText

End Sub

в test.cfm

<cfif isdefined("URL.urltoken")>
    <cfset session.urltoken="#URL.urltoken#">
  <cfelse>
    <cfset session.username="bob">
</cfif>


<cfoutput>session.urltoken="#session.urltoken#"</cfoutput><br>
<cfoutput>session.username="#session.username#"</cfoutput><br>
<cfoutput>session.sessionID="#session.sessionID#"</cfoutput>

Хорошо, что теперь работает, интересно, янужно будет помнить, что для веб-службы или вызовов HTTP, не использующих браузер, мне нужно будет передать идентификатор сессии в URL-адресе вручную.

1 Ответ

2 голосов
/ 27 июня 2011

Определенно сеанс поддерживается на основе куки-файла браузера.При первом запросе от сервера браузера назначьте токен, и он будет использоваться для подключения к сеансу в оставшейся части запроса.Если куки-файлы браузера отключены, вам может потребоваться, чтобы они передавали CFID и CFTOKEN в URL для каждого запроса, а в случае управления сеансом j2ee вам также может понадобиться передавать jsessionId (лучший способ - добавлять session.URLToken в каждом запросе.)

В макросе слова вы получаете новый jsessionId, потому что слово может не иметь cookie и не может сохранить соединение, но просто попытаться выполнить контакцию сеанса .URLToken при следующем вызове Webservice, и вы получите весь свой сеанс обратно даже после повторного открытия слова или даже васможно попробовать скопировать session.URLToken из запроса браузера Chrome и добавить его в запрос Firefox, и вы получите тот же сеанс, доступный в Chrome (то же самое будет работать, если вы попытаетесь использовать другой компьютер).

Так что мораль историиявляется комбинацией CFID, CFTOKEN, JSessionId (в случае управления сессиями J2ee) для соединения между клиентом и сервером через URL или Cookie.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...