Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/34: Рейтинг темы: голосов - 34, средняя оценка - 4.94
2 / 2 / 1
Регистрация: 18.03.2013
Сообщений: 10

Как сохранить сессии (cookies) при использовании WebView?

29.04.2015, 04:24. Показов 6666. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, пожалуйста, как сделать так, чтобы при закрытии приложения сессии не сбрасывались? Задача состоит в том, чтобы написать маленький браузер, чтобы при закрытии браузера пользователь не разлогинивался. Долго гуглил, но точного решения не нашел. Нашел, что вероятно можно использовать custom CookieManager (http://docs.oracle.com/javase/... ustom.html), а также разгадка кроется в этом вопросе -- http://stackoverflow.com/quest... connection. Но это не помогло, я по-прежнему не знаю, что делать. Помогите, пожалуйста, разобраться в этом.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.04.2015, 04:24
Ответы с готовыми решениями:

Как использовать сессии и cookies вместе?
Сделала в авторизации чекбокс "запомнить меня", и столкнулась с проблемами. Изначально делала сессии, всё было хорошо, но решила же как в...

Получить cookies из загруженной страницы в webview javafx
нужно в cookies найти параметр ssoid

Как сохранить cookies из ответа на POST-запрос?
### httpPost def httpPost(url, _params): bot = atape_http_client() print u'Найдены параметры\n' a = bot.httpPost(url, _params) ...

2
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
29.04.2015, 23:24
Цитата Сообщение от klgleb Посмотреть сообщение
Подскажите, пожалуйста, как сделать так, чтобы при закрытии приложения сессии не сбрасывались
надо сохранять куки сессии на диск чтобы потом опять их загрузить как подсказывает кэп
0
2 / 2 / 1
Регистрация: 18.03.2013
Сообщений: 10
30.05.2015, 22:44  [ТС]
Лучший ответ Сообщение было отмечено klgleb как решение

Решение

В результате решил проблему через CookieManager. Дело в том, что обычный CookieStore (та штука, которая управляет хранением cookies) не сохраняет их на диске. Но зато есть возможность написать собственную реализацию, которая их сохраняет -- заготовка есть здесь. Я вот таким образом сохранил их в виде JSON (с использованием библиотеки simple json; Filer.setFile и Filer.getFile просто записывают и читают строку из файла):



Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
package sample.coockies;
 
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import utils.Filer;
 
import java.net.*;
import java.util.List;
 
/**
 * Created by klgleb on 30.05.15.
 */
public class MyCookieStore implements CookieStore, Runnable {
    CookieStore store;
 
    public MyCookieStore() {
        // get the default in memory cookie store
        store = new CookieManager().getCookieStore();
 
        // todo: read in cookies from persistant storage
        // and add them store
 
        String s = Filer.getFile("cookies.json");
 
        if (s.equals("")) {
            s = "[]";
        }
 
        JSONParser parser = new JSONParser();
        Object obj = null;
        try {
            obj = parser.parse(s);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        JSONArray arr = (JSONArray) obj;
 
        for (int i = 0; i < arr.size(); i++) {
            JSONObject o = (JSONObject) arr.get(i);
 
            UriAndCookie uriAndCookie = jsonToCookie(o);
            add(uriAndCookie.getUri(), uriAndCookie.getCookie());
 
        }
 
 
        // add a shutdown hook to write out the in memory cookies
        Runtime.getRuntime().addShutdownHook(new Thread(this));
    }
 
    public void run() {
        // todo: write cookies in store to persistent storage
 
        List<HttpCookie> cookies = getCookies();
        List<URI> urIs = getURIs();
 
        JSONArray arr = new JSONArray();
 
 
        for (int i = 0; i < cookies.size(); i++) {
            URI uri = null;
 
            for (int j = 0; j < urIs.size(); j++) {
                if (urIs.get(j).toString().contains(cookies.get(i).getDomain().substring(1))) {
                    uri = urIs.get(j);
                }
            }
 
            JSONObject o = cookieToJson(new UriAndCookie(uri, cookies.get(i)));
 
            arr.add(o);
        }
 
        Filer.setFile("cookies.json", arr.toString());
    }
 
    public void add(URI uri, HttpCookie cookie) {
        store.add(uri, cookie);
    }
 
    public List<HttpCookie> get(URI uri) {
        return store.get(uri);
    }
 
    public List<HttpCookie> getCookies() {
        return store.getCookies();
    }
 
    public List<URI> getURIs() {
        return store.getURIs();
    }
 
    public boolean remove(URI uri, HttpCookie cookie) {
        return store.remove(uri, cookie);
    }
 
    public boolean removeAll()  {
        return store.removeAll();
    }
 
 
    private JSONObject cookieToJson(UriAndCookie object) {
 
        HttpCookie cookie = object.getCookie();
        JSONObject obj = new JSONObject();
 
        obj.put("comment", cookie.getComment());
        obj.put("value", cookie.getValue());
        obj.put("comment_url", cookie.getCommentURL());
        obj.put("discard", cookie.getDiscard());
        obj.put("domain", cookie.getDomain());
        obj.put("max_age", cookie.getMaxAge());
        obj.put("name", cookie.getName());
        obj.put("path", cookie.getPath());
        obj.put("port_list", cookie.getPortlist());
        obj.put("secure", cookie.getSecure());
        obj.put("version", cookie.getVersion());
        obj.put("uri", object.getUri().toString());
 
        return obj;
 
    }
 
    private UriAndCookie jsonToCookie(JSONObject o) {
        HttpCookie cookie = new HttpCookie((String) o.get("name"), (String) o.get("value"));
 
        String comment = (String) o.get("comment");
        if( comment != null) cookie.setComment(comment);
 
        String commentUrl = (String) o.get("comment_url");
        if( commentUrl != null) cookie.setCommentURL(commentUrl);
 
        Boolean discard = (Boolean) o.get("discard");
        if( discard != null) cookie.setDiscard(discard);
 
 
        String domain = (String) o.get("domain");
        if( domain != null) cookie.setDomain(domain);
 
        Long maxAge = (Long) o.get("max_age");
        if( maxAge != null) cookie.setMaxAge(maxAge);
 
 
        String path = (String) o.get("path");
        if( path != null) cookie.setPath(path);
 
        String portList = (String) o.get("port_list");
        if( portList != null) cookie.setPortlist(portList);
 
 
        Boolean secure = (Boolean) o.get("secure");
        if( secure != null) cookie.setSecure(secure);
 
        Long version = (Long) o.get("version");
        if( version != null) cookie.setVersion(version.intValue());
 
 
 
        try {
            URI uri = new URI((String) o.get("uri"));
            return new UriAndCookie(uri, cookie);
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
 
        return null;
 
    }
 
    private static class UriAndCookie {
        private final URI uri;
        private final HttpCookie cookie;
 
        public UriAndCookie(URI uri, HttpCookie cookie) {
            this.uri = uri;
            this.cookie = cookie;
        }
 
        public URI getUri() {
            return uri;
        }
 
        public HttpCookie getCookie() {
            return cookie;
        }
    }
}
Ну и осталось только запилить его непосредственно в код:

Java
1
2
3
 MyCookieStore cookieStore = new  MyCookieStore();
        CookieManager cookieManager = new CookieManager(cookieStore, new MyCookiePolicy());
        CookieHandler.setDefault(cookieManager);
Где MyCookiePolicy очень простой:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
import java.net.CookiePolicy;
import java.net.HttpCookie;
import java.net.URI;
 
/**
 * Created by klgleb on 30.05.15.
 */
public class MyCookiePolicy implements CookiePolicy {
    @Override
    public boolean shouldAccept(URI uri, HttpCookie cookie) {
        return true;
    }
}
Вот так вот и работает. На всякий случай еще приведу код для сохранения файлов (немного кривоватый):
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package utils;
 
 
import java.io.*;
import java.nio.charset.Charset;
 
/**
 * Created by klgleb on 29.05.15.
 */
public class Filer {
 
    public static String getFile(String fileName) {
        File file = new File(fileName);
        if(!file.exists()) {
            return "";
        }
 
        String result = "";
 
 
        BufferedReader bufReader = null;
        try {
            bufReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), Charset.forName("UTF-8")));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
 
            return "";
        }
 
        String curLine;
        try {
            while ((curLine = bufReader.readLine()) != null) {
                result +=  curLine;
            }
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
 
        return result;
    }
 
    public static void setFile(String fileName, String data) {
 
        //Определяем файл
        File file = new File(fileName);
 
        try {
            //проверяем, что если файл не существует то создаем его
            if(!file.exists()){
                file.createNewFile();
            }
 
            //PrintWriter обеспечит возможности записи в файл
            PrintWriter out = new PrintWriter(file.getAbsoluteFile());
 
            try {
                //Записываем текст у файл
                out.print(data.toString());
            } finally {
                //После чего мы должны закрыть файл
                //Иначе файл не запишется
                out.close();
            }
        } catch(IOException e) {
            throw new RuntimeException(e);
        }
    }
}

Во всем этом есть одно но: здесь написано, что использование CookieManager -- это плохо, нужно искать другие пути (какие -- не знаю).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.05.2015, 22:44
Помогаю со студенческими работами здесь

Cookies и Сессии
Здравствуйте. Вот добрался до куков и до сессий. Так как в голове всё размыто, а все примеры ограничиваются только подсчётом...

Как сохранить данные в cookies,которые вводит пользователь через prompt?
Привет,возникли трудности с одним заданием,только изучаю js.Как сохранить данные в cookies,которые вводит пользователь через prompt?

Проблема передачи переменных в сессии при попытке сохранить файл asp в формате excel
Кто-нибудь сталкивался с проблемой передачи переменных в сессии при попытке сохранить файл asp в формате excel? Я пытаюсь передать...

Как Сохранить Значение Переменной Втечение Всей Сессии?
Есть некая форма авторизации. Нужно, чтобы логин введенный на этой форме постоянно хранился в переменной, для того, чтобы на каждое...

Как сохранить путь диалогового окна открытый в прошлой сессии?
В 1С делаю под собой: 1)&quot;Сервис-дополнительные внешние отчеты и обработки - дополнительные внешние печатные формы - редактировать некую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru