Страница 1 из 3
HttpSession
Добавлено: 11 окт 2012, 09:18
tanchik
Здравствуйте!Нужна помощь! не могу разобраться с сессиями в java. Нужно просто записать логин и пароль в сессию, но не могу понять как
Нашла такой пример:
Код: Выделить всё
HttpSession session = request.getSession();
synchronized(session) {
UsersService service = new UsersService();
User2 u = service.get(user.getId());
session.setAttribute("CurrentUser", u);
}
но когда так пишу - eclipse подчеркивает HttpSession (HttpSession cannot be resolved to a type). Других примеров не нашла

Re: HttpSession
Добавлено: 11 окт 2012, 09:57
rezak90
потому что HttpSession из javax.servlet.http , что понятно что это не для андроида.
Сессия, я так понял вам нужно сохранять в куки, тогда копайте в сторону Cookie. Example:
http://stackoverflow.com/questions/3858 ... ion-cookie
Re: HttpSession
Добавлено: 11 окт 2012, 09:59
tanchik
rezak90 писал(а):потому что HttpSession из javax.servlet.http , что понятно что это не для андроида.
а как же тогда быть? куда тогда переменные записать? есть такая возможность вообще? спасибо!
ага, ясно, буду куки смотреть. А правильно будет в куки пароль и логин писать?
Re: HttpSession
Добавлено: 11 окт 2012, 10:00
rezak90
tanchik писал(а):rezak90 писал(а):потому что HttpSession из javax.servlet.http , что понятно что это не для андроида.
а как же тогда быть? куда тогда переменные записать? есть такая возможность вообще? спасибо!
как я уже писал - куки, пишите туда что душа пожелает =)
Re: HttpSession
Добавлено: 11 окт 2012, 10:06
tanchik
rezak90 писал(а):
как я уже писал - куки, пишите туда что душа пожелает =)
а правильно будет туда логин/пароль писать?
Re: HttpSession
Добавлено: 11 окт 2012, 10:14
rezak90
смотря в каком виде, в зашифрованом думаю да. Та и уровень защиты зависит от проекта. Можно поступить по параноидальному - создать свой протокол, шифровать канал (можно двойным), шифровать дивайс

Re: HttpSession
Добавлено: 12 окт 2012, 10:50
tanchik
rezak90 писал(а):смотря в каком виде, в зашифрованом думаю да. Та и уровень защиты зависит от проекта. Можно поступить по параноидальному - создать свой протокол, шифровать канал (можно двойным), шифровать дивайс

а если я прошла авторизацию и у меня записалась кука с ид сессии, возможно мне не нужно каждый раз авторизоваться, при переходах по страницам, а передавать на сервер вместо логина/пароля куку с идишником сессии?
Прошу прощения, если вопрос глупый

Re: HttpSession
Добавлено: 12 окт 2012, 12:07
neoksi
tanchik писал(а):rezak90 писал(а):смотря в каком виде, в зашифрованом думаю да. Та и уровень защиты зависит от проекта. Можно поступить по параноидальному - создать свой протокол, шифровать канал (можно двойным), шифровать дивайс

а если я прошла авторизацию и у меня записалась кука с ид сессии, возможно мне не нужно каждый раз авторизоваться, при переходах по страницам, а передавать на сервер вместо логина/пароля куку с идишником сессии?
Прошу прощения, если вопрос глупый

Обычно так и делают, но если сайт ваш, то проще сделать API, чем парсить его. Процессорное время нужно экономить, а то будет все тормозить как у фэйсбука =)
Re: HttpSession
Добавлено: 12 окт 2012, 12:25
tanchik
neoksi писал(а):
Обычно так и делают, но если сайт ваш, то проще сделать API, чем парсить его. Процессорное время нужно экономить, а то будет все тормозить как у фэйсбука =)
а есть ссылочка на пример? спасибо!
Re: HttpSession
Добавлено: 12 окт 2012, 12:37
rezak90
та просто добавляйте куки с каждым следующим запросом. Логика:
1) первый заход на сайт - авторизуемся и получаем куки в requeste;
2) переходим на любую нужную нам страницу и к текущему соединению добавляем куки (что то в виде такого: httpConnection.setCookie(cookie);).
Re: HttpSession
Добавлено: 12 окт 2012, 14:04
tanchik
rezak90 писал(а):та просто добавляйте куки с каждым следующим запросом. Логика:
1) первый заход на сайт - авторизуемся и получаем куки в requeste;
2) переходим на любую нужную нам страницу и к текущему соединению добавляем куки (что то в виде такого: httpConnection.setCookie(cookie);).
что-то я не пойму
Вот я зашла в первый раз так:
Код: Выделить всё
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
/* returns true if username and password is true*/
HttpPost httppost = new HttpPost(params[0]);
String res = null;
try {
// Add user name and password
EditText uname = (EditText)findViewById(R.id.txt_username);
String username = uname.getText().toString();
EditText pword = (EditText)findViewById(R.id.txt_password);
String password = pword.getText().toString();
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
nameValuePairs.add(new BasicNameValuePair("LoginForm[username]", username));
nameValuePairs.add(new BasicNameValuePair("LoginForm[password]", password));
nameValuePairs.add(new BasicNameValuePair("yt0", "Войти"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
//System.out.println(httppost);
// Execute HTTP Post Request
Log.w("SENCIDE", "Execute HTTP Post Request");
HttpResponse response = httpclient.execute(httppost);
String str = inputStreamToString(response.getEntity().getContent()).toString();
Log.w("SENCIDE", str);
CookieStore cookieStore = new BasicCookieStore();
// Create local HTTP context
HttpContext localContext = new BasicHttpContext();
// Bind custom cookie store to the local context
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
//***********
HttpResponse response1 = httpclient.execute(httppost, localContext);
//***********
List<Cookie> cookies = cookieStore.getCookies();
for (int i = 0; i < cookies.size(); i++) {
System.out.println("Local cookie: " + cookies.get(i));
}
куки есть, и при удачной авторизации я перехожу на другую активити.
Код: Выделить всё
if (res=="Login successful"){
Intent intent = new Intent(MainActivity.this, MainMenu.class);
startActivity(intent);
} else {
tvInfo.setText(res);
}
а дальше как мне быть?
пробую вот так:
Код: Выделить всё
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
/* returns true if username and password is true*/
HttpPost httppost = new HttpPost(params[0]);
String res = null;
try {
// sessionid
CookieStore cookieStore = new BasicCookieStore();
// Create local HTTP context
HttpContext localContext = new BasicHttpContext();
// Bind custom cookie store to the local context
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
//***********
HttpResponse response1 = httpclient.execute(httppost, localContext);
//***********
List<Cookie> cookies = cookieStore.getCookies();
HttpConnection.setCookie(cookies);
но подчеркивает HttpConnection(HttpConnection cannot be resolved)
Помогите, я что-то сегодня совсем тормоЗЮ

Re: HttpSession
Добавлено: 12 окт 2012, 15:12
tanchik
делаю вот так:
Код: Выделить всё
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
/* returns true if username and password is true*/
HttpPost httppost = new HttpPost(params[0]);
String res = null;
try {
// sessionid
CookieStore cookieStore = new BasicCookieStore();
// Create local HTTP context
HttpContext localContext = new BasicHttpContext();
// Bind custom cookie store to the local context
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
//***********
HttpResponse response1 = httpclient.execute(httppost, localContext);
//***********
List<Cookie> cookies = cookieStore.getCookies();
HttpURLConnection conn = (HttpURLConnection) new URL(params[0]).openConnection();
conn.setRequestProperty("Cookie","PHPSESSID=" + cookies.get(0).getValue());
conn.connect();
// Execute HTTP Post Request
Log.w("SENCIDE", "Execute HTTP Post Request");
HttpResponse response = httpclient.execute(httppost);
System.out.println(response);
String str = inputStreamToString(response.getEntity().getContent()).toString();
Log.w("SENCIDE", str);
System.out.println(str.toString());
}
но приложение закрывается.Вот логи ошибок:
Код: Выделить всё
10-12 12:06:27.095: E/AndroidRuntime(1150): FATAL EXCEPTION: AsyncTask #4
10-12 12:06:27.095: E/AndroidRuntime(1150): java.lang.RuntimeException: An error occured while executing doInBackground()
10-12 12:06:27.095: E/AndroidRuntime(1150): at android.os.AsyncTask$3.done(AsyncTask.java:299)
10-12 12:06:27.095: E/AndroidRuntime(1150): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
10-12 12:06:27.095: E/AndroidRuntime(1150): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
10-12 12:06:27.095: E/AndroidRuntime(1150): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
10-12 12:06:27.095: E/AndroidRuntime(1150): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-12 12:06:27.095: E/AndroidRuntime(1150): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
10-12 12:06:27.095: E/AndroidRuntime(1150): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
10-12 12:06:27.095: E/AndroidRuntime(1150): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
10-12 12:06:27.095: E/AndroidRuntime(1150): at java.lang.Thread.run(Thread.java:856)
10-12 12:06:27.095: E/AndroidRuntime(1150): Caused by: java.lang.NullPointerException
10-12 12:06:27.095: E/AndroidRuntime(1150): at com.example.op.active_talk.com.AsyncTaskDemo.doInBackground(MainMenu.java:178)
10-12 12:06:27.095: E/AndroidRuntime(1150): at com.example.op.active_talk.com.AsyncTaskDemo.doInBackground(MainMenu.java:1)
10-12 12:06:27.095: E/AndroidRuntime(1150): at android.os.AsyncTask$2.call(AsyncTask.java:287)
10-12 12:06:27.095: E/AndroidRuntime(1150): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-12 12:06:27.095: E/AndroidRuntime(1150): ... 5 more
Вот строка, на которую собственно ругается:
Код: Выделить всё
String str = inputStreamToString(response.getEntity().getContent()).toString();
Re: HttpSession
Добавлено: 12 окт 2012, 22:49
rezak90
потому что AsyncTask выполняется в другом потоке и пытается обратится со своего потока в метод который находится в другом потоке, перенесите inputStreamToString в doInBackground
Re: HttpSession
Добавлено: 15 окт 2012, 09:56
tanchik
rezak90 писал(а):потому что AsyncTask выполняется в другом потоке и пытается обратится со своего потока в метод который находится в другом потоке, перенесите inputStreamToString в doInBackground
вы имеете ввиду вот это в doInBackground перенести?
Код: Выделить всё
private Object inputStreamToString(InputStream content) {
// TODO Auto-generated method stub
return null;
}
Re: HttpSession
Добавлено: 15 окт 2012, 12:22
rezak90
да, именно это
Re: HttpSession
Добавлено: 15 окт 2012, 15:00
tanchik
rezak90 писал(а):да, именно это
Делаю такой запрос:
Код: Выделить всё
HttpURLConnection conn = (HttpURLConnection) new URL(params[0]).openConnection();
conn.setRequestProperty("Cookie","PHPSESSID=" + cookies.get(0).getValue());
conn.connect();
System.out.println(conn.getResponseCode());
if (conn.getResponseCode() != 200) {
System.out.println("Сервер не отвечает.");
return res;
} else {
String str = conn.getResponseMessage().toString();
String stream = conn.getInputStream().toString();
System.out.println(str.toString());
String html = str.toString();
Document doc = Jsoup.parse(html);
System.out.println(doc);
}
и получаю в консоли такую страницу
Код: Выделить всё
10-15 11:55:30.831: I/System.out(1437): <html>
10-15 11:55:30.831: I/System.out(1437): <head></head>
10-15 11:55:30.831: I/System.out(1437): <body>
10-15 11:55:30.831: I/System.out(1437): OK
10-15 11:55:30.841: I/System.out(1437): </body>
10-15 11:55:30.850: I/System.out(1437): </html>
а хочу получить код страницы, к которой отправляю запрос, что я делаю не так?
Re: HttpSession
Добавлено: 15 окт 2012, 15:41
rezak90
а это разве не код?
10-15 11:55:30.831: I/System.out(1437): <html>
10-15 11:55:30.831: I/System.out(1437): <head></head>
10-15 11:55:30.831: I/System.out(1437): <body>
10-15 11:55:30.831: I/System.out(1437): OK
10-15 11:55:30.841: I/System.out(1437): </body>
10-15 11:55:30.850: I/System.out(1437): </html>
или вы что то другое имеете в виду?
Re: HttpSession
Добавлено: 15 окт 2012, 16:07
tanchik
rezak90 писал(а):а это разве не код?
10-15 11:55:30.831: I/System.out(1437): <html>
10-15 11:55:30.831: I/System.out(1437): <head></head>
10-15 11:55:30.831: I/System.out(1437): <body>
10-15 11:55:30.831: I/System.out(1437): OK
10-15 11:55:30.841: I/System.out(1437): </body>
10-15 11:55:30.850: I/System.out(1437): </html>
или вы что то другое имеете в виду?
это код, вот только не тот, который я увидеть хотела. Я запрос делаю к внутренней странице админки сайта, а получаю в ответ код 200 и ОК.А хотелось бы саму страницу получить, для парсинга.

Re: HttpSession
Добавлено: 15 окт 2012, 16:32
rezak90
200 это request код сервера, означает что запрос был удачен.
Вот как я делаю авторизацию:
Код: Выделить всё
private void authBC(String login, String psw) {
try {
URL url = new URL("http://dreamscity.combats.com/enter.pl?login=" + login + "&psw=" + psw);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setInstanceFollowRedirects(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1");
conn.setConnectTimeout(15000);
conn.setReadTimeout(15000);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.connect();
Log.i("MyTag", "response: " + conn.getResponseMessage());
String content = convertStreamToString(conn.getInputStream());
Log.i("MyTag", "content: " + content); //вот здесь выводится то что вам нужно - контент
Log.i("MyTag", "url: " + conn.getURL());
Log.i("MyTag", "ContentEncoding: " + conn.getContentEncoding());
Log.i("MyTag", "ContentType: " + conn.getContentType());
Log.i("MyTag", "response code: " + conn.getResponseCode());
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
String convertStreamToString(InputStream is) {
try {
return new Scanner(is).useDelimiter("\\A").next();
} catch (NoSuchElementException e) {
return "warning";
}
}
Re: HttpSession
Добавлено: 15 окт 2012, 16:53
tanchik
rezak90 писал(а):200 это request код сервера, означает что запрос был удачен.
я понимаю что удачен, только не пойму как из ответа достать код запрашиваемой странички
вот консоль, если делаю как вы:
Код: Выделить всё
10-15 13:58:51.950: I/MyTag(1790): response: OK
10-15 13:58:51.961: I/MyTag(1790): content: null
10-15 13:58:51.971: I/MyTag(1790): ContentEncoding: null
10-15 13:58:51.971: I/MyTag(1790): ContentType: text/html
10-15 13:58:51.981: I/MyTag(1790): response code: 200