Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > записать cookies


Автор: vthm3 2.9.2015, 14:22
хорошо.. а как записать cookies?

у меня веб джава програма, которая находится на локалхост, отправляет запрос на другой севрер.. и в результате сервер присылает свои cookies..

я получаю эти cookie и записываю так:
Код

Application.getInstance().getMainWindow.executeJavaScript("document.cookie='"cookie.getName()+"="cookie.getValue +"; domain="+cookie.getDomain()+"'");



в хроме, включаю инструмент для разработчиков, и там вижу, что параметры куки установлены..


имя - параметр - localhost - Session


НО.. когда я устанавливаю cookie.getDomain() куки не устанавыливаются вообще, если я это удаляю (cookie.getDomain()), то куки устанавливаются с доменом localhost..

как мне записать эти куки с тем доменом который вовращает куки?

Автор: Samotnik 3.9.2015, 10:51
vthm3, давай нормальный кусок кода. Как ты получаешь куки и как ты хочешь их дальше использовать? 

Автор: vthm3 3.9.2015, 13:35
Цитата(Samotnik @ 3.9.2015,  10:51)
vthm3, давай нормальный кусок кода. Как ты получаешь куки и как ты хочешь их дальше использовать?


Samotnik,

у меня есть два домена.. 

sharepoint.server.com и app.server.com


где-то по ходу работы программы app.server.com я делаю невидимую ntlm аудентификацию на сервере sharepoint.server.com..
sharepoint.server.com возвращает мне куки, которые я хочу записать в память браузера..

как мне это сделать?


я их могу записать, но только с параметром демен app.server.com.. 
и в этом случае они не будут видимы серверу sharepoint.server.com


как их записать в память браузера, чтобы sharepoint.server.com не просил последующую авторизация пользователя, а использовал данных куки из браузера??
то есть, как мне их записать в память браузера с доменом sharepoint.server.com, при этом работаючи со страницы, которая находится на домене app.server.com??

Добавлено @ 13:41
Цитата(Samotnik @ 3.9.2015,  10:51)
vthm3, давай нормальный кусок кода. Как ты получаешь куки и как ты хочешь их дальше использовать?

Код

DefaultHttpClient httpClient = new DefaultHttpClient(cm,params);
httpClient.getAuthSchemes().register("ntlm", new NTLMSchemeFactory());
httpClient.getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY),
new NTCredentials("login", "pass", null, "server.net"));
HttpGet httpget = new HttpGet("htts://sharepoint.server.com/");
HttpResponse response;
try {
     response = httpClient.execute(httpget);
     StatusLine entity = response.getStatusLine();
     System.out.println("executing request " + httpget.getRequestLine());
     System.out.println(entity.toString());
     System.out.println("");
Header[] headers = response.getAllHeaders();
for (Header header : headers) {
      System.out.println(header.getName() + " : " + header.getValue());
}

List<Cookie> cookies = httpClient.getCookieStore.getCookies();

for(Cookie cookie:cookies)
{
JavaApp.getInstance().getMainWindow().executeJavaScript(
"document.cookie='" + cookie.getName()+"="+cookie.getValue() +"; domain="+cookie.getDomain()+"; path="+cookie.getPath()+"'");
}


и в этом случае оно не устанавливает куки, потому что cookie.getDomain() = sharepoint.server.com, а страница работает с домена app.server.com
НО, если я со строчки удалаю +"; domain="+cookie.getDomain(), и ничего не пише в домен, то оно устанавливает куки, но только с доменом app.server.com

А мне нужно установить куки с доменом sharepoint.server.com

КАК МНЕ ЭТО СДЕЛАТЬ???????????????????????????????

Автор: Samotnik 4.9.2015, 00:41
Так ну теперь хоть стало ясно что к чему smile
Да, действительно, cookie.getDomain() вернет домен sharepoint.server.com и это логично. 
Можно сделать "хак", вместо: 
Код

JavaApp.getInstance().getMainWindow().executeJavaScript(
"document.cookie='" + cookie.getName()+"="+cookie.getValue() +"; domain="+cookie.getDomain()+"; path="+cookie.getPath()+"'");

написать в лоб:
Код

JavaApp.getInstance().getMainWindow().executeJavaScript(
"document.cookie='" + cookie.getName()+"="+cookie.getValue() +"; domain=app.server.com; path="+cookie.getPath()+"'");

Я помню в таких случаях действует политика веб безопастности, из раздела "кросс доменные запросы", которые запрещены в принципе. Обычно, это действительно можно обойти через iframe, так что подход верный. Попробуй этот вариант, хотя он вроде как очевиден, уже пробовал?

еще нужно проверить что cookie.getPath() возвращает?

Автор: vthm3 4.9.2015, 09:53
cookie.getPath = /

Ваш вариант пробовал, в этом случае, куки не устанавливаются вообще...

больше без вариантов?

Автор: Samotnik 4.9.2015, 10:27
vthm3, ожидаемо. вообще вариант с: .server.com должен работать. Но разрешит ли полиси напрямую сделать. Попробуй, много времени не займёт.

Что бы выглядело красиво, а не хардкодом:
Код

String domainName = cookie.getDomain();
String domainNamePrefix = domainName.substring(domainName.indexOf("."), domainName.length());

Автор: vthm3 4.9.2015, 10:44
а если бы у меня было совершенно два разных сервера, домена..

тогда не возможно было бы это сделать?

например.. server.com and server.net

как в этом случае?

Добавлено @ 10:49
Цитата(Samotnik @ 4.9.2015,  00:41)
Так ну теперь хоть стало ясно что к чему smile
Да, действительно, cookie.getDomain() вернет домен sharepoint.server.com и это логично. 
Можно сделать "хак", вместо: 
Код

JavaApp.getInstance().getMainWindow().executeJavaScript(
"document.cookie='" + cookie.getName()+"="+cookie.getValue() +"; domain="+cookie.getDomain()+"; path="+cookie.getPath()+"'");

написать в лоб:
Код

JavaApp.getInstance().getMainWindow().executeJavaScript(
"document.cookie='" + cookie.getName()+"="+cookie.getValue() +"; domain=app.server.com; path="+cookie.getPath()+"'");

Я помню в таких случаях действует политика веб безопастности, из раздела "кросс доменные запросы", которые запрещены в принципе. Обычно, это действительно можно обойти через iframe, так что подход верный. Попробуй этот вариант, хотя он вроде как очевиден, уже пробовал?

еще нужно проверить что cookie.getPath() возвращает?

Код

JavaApp.getInstance().getMainWindow().executeJavaScript(
"document.cookie='" + cookie.getName()+"="+cookie.getValue() +"; domain=app.server.com; path="+cookie.getPath()+"'");


да, но тогда эти куки не сможет читать sharepoint.server.com..

а в том то и дело, что нужно мне записать куки так, что бы они были видимы для sharepoint.server.com


и тогда когда я вызываю ссылку на sharepoint.server.com, из app.server.com (java application), sharepoint будет видеть свои же куки (которые он установил), и не показывает мне окно авторизации (так как по куках понимает что пользователь уже авторизирован)


Автор: Samotnik 4.9.2015, 10:53
Цитата(vthm3 @  4.9.2015,  10:44 Найти цитируемый пост)
а если бы у меня было совершенно два разных сервера, домена..
тогда не возможно было бы это сделать?
например.. server.com and server.net

Нет, это не возможно. Куки шарятся только на одном домене, между поддоменами и то, как видишь, не так просто даже сделать и это. site.com может расшарить на foo.site.com и bar.site.com

Автор: vthm3 4.9.2015, 10:56
ну а если я работаю из app.server.com, и получаю куки из sharepoint.server.com,

то могу ли я установить куки sharepoint server на домен app.server.com с доменом .server.com


и будут ли они тогда видимы share point servery из главной программы app.server.com??

Автор: Samotnik 4.9.2015, 10:56
Цитата(vthm3 @  4.9.2015,  10:44 Найти цитируемый пост)
да, но тогда эти куки не сможет читать sharepoint.server.com..

почему? По идее должен мочь. Вот пример с винграда:

Автор: vthm3 4.9.2015, 11:04
хорошо, нужно попробовать, а то у меня сейчас главная программа на локалхосте.. а sharepoint на сервере)

спасибо)

Автор: Samotnik 4.9.2015, 11:19
vthm3, у меня была такая же задача. Был главный проект site.xxx и я делал под проект sub.site.xxx 
После одобрения главного сервера я на нём выставлял куку .site.xxx и мой поддомен был доволен. Единственная проблема была с IE9, который не хотел работать с кроссдоменными запросами (и ему всё равно что я шлю запросы на свой же домен, а не посторонний) и для IE9 я создавал iframe. Но в 10 и 11 эта проблема ушла и костыль был удалён год назад. 
Да, ещё в томкате, если /ты хочешь шарить сессию/ server.xml нужно написать:
Код

<Context sessionCookieDomain=".mydomain.com" sessionCookiePath="/">

Автор: vthm3 4.9.2015, 11:39
Цитата(Samotnik @ 4.9.2015,  11:19)
vthm3, у меня была такая же задача. Был главный проект site.xxx и я делал под проект sub.site.xxx 
После одобрения главного сервера я на нём выставлял куку .site.xxx и мой поддомен был доволен. Единственная проблема была с IE9, который не хотел работать с кроссдоменными запросами (и ему всё равно что я шлю запросы на свой же домен, а не посторонний) и для IE9 я создавал iframe. Но в 10 и 11 эта проблема ушла и костыль был удалён год назад. 
Да, ещё в томкате, если /ты хочешь шарить сессию/ server.xml нужно написать:
Код

<Context sessionCookieDomain=".mydomain.com" sessionCookiePath="/">

да, но у вас был главный домен и поддомен..

а у меня два поддомена.. sharepoint.server.com и portal.server.com

и получается что мне надо установить куки sharepoint сервера с главным доменом ".server.com"

или это то же самое по принципу получается?

Автор: Samotnik 8.9.2015, 19:44
ну что? есть новости? Я думаю так, что если поддомен утсановит куки для главного домена, то всё заработает. 

Автор: vthm3 11.9.2015, 16:31
Цитата(Samotnik @ 8.9.2015,  19:44)
ну что? есть новости? Я думаю так, что если поддомен утсановит куки для главного домена, то всё заработает.

нет, еще нету новостей.. на сервере пока не пробовал, коллега в отпуске.. а у меня доступа к серверу нет)

Автор: vthm3 15.9.2015, 13:46
Цитата(Samotnik @ 8.9.2015,  19:44)
ну что? есть новости? Я думаю так, что если поддомен утсановит куки для главного домена, то всё заработает.

Samotnik, 

установил програму на сервер..

возвращает куки из сервера c доменом .server.com, они установились....
(когда запускал програму на локалохосте, то куки с доменом .server.com не записывались)

но йомайо... оно все равно не работает... и просит авторизация когда я обращаюсь к нему опять.....

как мне быть???????????






и еще момент...
хотя домены и одинаковые, но один у меня - app.server.com, а второй - sharepoint.server.com:80

что мне делать с этим 80.. как его записать, запомнить в куки.. или чего с ним делать????





и еще такой нюанс...
Захожу на sp.server.com.. получаю в окне sharepoint и все что мне там нужно.. делаю авторизацию, получаю куки.. все хорошо работает)
куки вижу в инструменти разработчиков в хроме, например...

теперь, в том же инструменте, удалаю все куки, которые вернул мне sp.server.com, обновляю страничку, и оно все равно работает, и все равно я авторизирован остаюсь)
если нажимаю кнопку "выйти", появляется окно, в котором пишет "для того чтобы вийте из пользователя, нужно также закрыть браузер, только тогда вы окончательно выйдете из системы"

что это за фигня? как это все работает?

Автор: Samotnik 16.9.2015, 23:14
vthm3, Есть еще такое понятие как сессия. Порт 80 - порт по умолчанию, ничего с ним не делай. Может всё же сессия тоже шарится между поддоменами?

Автор: vthm3 17.9.2015, 10:13
Цитата(Samotnik @ 16.9.2015,  23:14)
vthm3, Есть еще такое понятие как сессия. Порт 80 - порт по умолчанию, ничего с ним не делай. Может всё же сессия тоже шарится между поддоменами?

а как мне отслеживать эти сессии, которые установлены с sp.server.com..??

и как сделать чтобы эти сессии были видимы из app.server.com (ну согласно задания выше)...

я не знаю что именно происходит с sp.server.com (я интересуюсь как ето может работать)... 
если посмотреть на информацию в инструменте для разработчиков в хроме, то там где "session storage" i "local storage" все пусто (никакие параметры не записаны). Есть только параметры, которые записаны в cookies.



и еще.. 
вот захожу я на sp.server.com, и появляется окно авторизации (логин и пароль)...
а можно ли отключить эту авторизацию.. чтобы все пользователи могли получить доступ к sharepoint.. a?




и какие еще есть варианты авторизироваться на sharepoint сайте из java программы автоматически?
выше я делал невидимую ntlm авторизацию, получал куки, и по идее оно должно было работать.. 
а какие принципиально другие есть варианты чтобы можно было авторизироватся на sharepoint сервере чтобы получить доступ, и чтобы пользователю не приходилось вводить логи и пароль вручную. Если есть возможность как отключить эту авторизацию в sharepoint, было бы это идеальное решение... кто знает еще какие варианты??

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)