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

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

29.04.2015, 04:24. Показов 6762. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru