HttpSession

tanchik
Сообщения: 57
Зарегистрирован: 21 сен 2012, 15:15

HttpSession

Сообщение tanchik » 11 окт 2012, 09:18

Здравствуйте!Нужна помощь! не могу разобраться с сессиями в java. Нужно просто записать логин и пароль в сессию, но не могу понять как :oops:
Нашла такой пример:

Код: Выделить всё

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). Других примеров не нашла :?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: HttpSession

Сообщение rezak90 » 11 окт 2012, 09:57

потому что HttpSession из javax.servlet.http , что понятно что это не для андроида.

Сессия, я так понял вам нужно сохранять в куки, тогда копайте в сторону Cookie. Example:
http://stackoverflow.com/questions/3858 ... ion-cookie
R.id.team
Политика на форуме запрещена

tanchik
Сообщения: 57
Зарегистрирован: 21 сен 2012, 15:15

Re: HttpSession

Сообщение tanchik » 11 окт 2012, 09:59

rezak90 писал(а):потому что HttpSession из javax.servlet.http , что понятно что это не для андроида.
а как же тогда быть? куда тогда переменные записать? есть такая возможность вообще? спасибо!

ага, ясно, буду куки смотреть. А правильно будет в куки пароль и логин писать?
Последний раз редактировалось tanchik 11 окт 2012, 10:00, всего редактировалось 1 раз.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: HttpSession

Сообщение rezak90 » 11 окт 2012, 10:00

tanchik писал(а):
rezak90 писал(а):потому что HttpSession из javax.servlet.http , что понятно что это не для андроида.
а как же тогда быть? куда тогда переменные записать? есть такая возможность вообще? спасибо!
как я уже писал - куки, пишите туда что душа пожелает =)
R.id.team
Политика на форуме запрещена

tanchik
Сообщения: 57
Зарегистрирован: 21 сен 2012, 15:15

Re: HttpSession

Сообщение tanchik » 11 окт 2012, 10:06

rezak90 писал(а): как я уже писал - куки, пишите туда что душа пожелает =)
а правильно будет туда логин/пароль писать?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: HttpSession

Сообщение rezak90 » 11 окт 2012, 10:14

смотря в каком виде, в зашифрованом думаю да. Та и уровень защиты зависит от проекта. Можно поступить по параноидальному - создать свой протокол, шифровать канал (можно двойным), шифровать дивайс :D
R.id.team
Политика на форуме запрещена

tanchik
Сообщения: 57
Зарегистрирован: 21 сен 2012, 15:15

Re: HttpSession

Сообщение tanchik » 12 окт 2012, 10:50

rezak90 писал(а):смотря в каком виде, в зашифрованом думаю да. Та и уровень защиты зависит от проекта. Можно поступить по параноидальному - создать свой протокол, шифровать канал (можно двойным), шифровать дивайс :D
а если я прошла авторизацию и у меня записалась кука с ид сессии, возможно мне не нужно каждый раз авторизоваться, при переходах по страницам, а передавать на сервер вместо логина/пароля куку с идишником сессии?
Прошу прощения, если вопрос глупый :oops:

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: HttpSession

Сообщение neoksi » 12 окт 2012, 12:07

tanchik писал(а):
rezak90 писал(а):смотря в каком виде, в зашифрованом думаю да. Та и уровень защиты зависит от проекта. Можно поступить по параноидальному - создать свой протокол, шифровать канал (можно двойным), шифровать дивайс :D
а если я прошла авторизацию и у меня записалась кука с ид сессии, возможно мне не нужно каждый раз авторизоваться, при переходах по страницам, а передавать на сервер вместо логина/пароля куку с идишником сессии?
Прошу прощения, если вопрос глупый :oops:
Обычно так и делают, но если сайт ваш, то проще сделать API, чем парсить его. Процессорное время нужно экономить, а то будет все тормозить как у фэйсбука =)

tanchik
Сообщения: 57
Зарегистрирован: 21 сен 2012, 15:15

Re: HttpSession

Сообщение tanchik » 12 окт 2012, 12:25

neoksi писал(а): Обычно так и делают, но если сайт ваш, то проще сделать API, чем парсить его. Процессорное время нужно экономить, а то будет все тормозить как у фэйсбука =)
а есть ссылочка на пример? спасибо!

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: HttpSession

Сообщение rezak90 » 12 окт 2012, 12:37

та просто добавляйте куки с каждым следующим запросом. Логика:
1) первый заход на сайт - авторизуемся и получаем куки в requeste;
2) переходим на любую нужную нам страницу и к текущему соединению добавляем куки (что то в виде такого: httpConnection.setCookie(cookie);).
R.id.team
Политика на форуме запрещена

tanchik
Сообщения: 57
Зарегистрирован: 21 сен 2012, 15:15

Re: HttpSession

Сообщение tanchik » 12 окт 2012, 14:04

rezak90 писал(а):та просто добавляйте куки с каждым следующим запросом. Логика:
1) первый заход на сайт - авторизуемся и получаем куки в requeste;
2) переходим на любую нужную нам страницу и к текущему соединению добавляем куки (что то в виде такого: httpConnection.setCookie(cookie);).

что-то я не пойму :oops:
Вот я зашла в первый раз так:

Код: Выделить всё

// 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)
Помогите, я что-то сегодня совсем тормоЗЮ :?

tanchik
Сообщения: 57
Зарегистрирован: 21 сен 2012, 15:15

Re: HttpSession

Сообщение tanchik » 12 окт 2012, 15:12

делаю вот так:

Код: Выделить всё

// 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();

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: HttpSession

Сообщение rezak90 » 12 окт 2012, 22:49

потому что AsyncTask выполняется в другом потоке и пытается обратится со своего потока в метод который находится в другом потоке, перенесите inputStreamToString в doInBackground
R.id.team
Политика на форуме запрещена

tanchik
Сообщения: 57
Зарегистрирован: 21 сен 2012, 15:15

Re: HttpSession

Сообщение tanchik » 15 окт 2012, 09:56

rezak90 писал(а):потому что AsyncTask выполняется в другом потоке и пытается обратится со своего потока в метод который находится в другом потоке, перенесите inputStreamToString в doInBackground
вы имеете ввиду вот это в doInBackground перенести?

Код: Выделить всё

private Object inputStreamToString(InputStream content) {
		// TODO Auto-generated method stub
		return null;
	}

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: HttpSession

Сообщение rezak90 » 15 окт 2012, 12:22

да, именно это
R.id.team
Политика на форуме запрещена

tanchik
Сообщения: 57
Зарегистрирован: 21 сен 2012, 15:15

Re: HttpSession

Сообщение tanchik » 15 окт 2012, 15:00

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>
а хочу получить код страницы, к которой отправляю запрос, что я делаю не так?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: HttpSession

Сообщение rezak90 » 15 окт 2012, 15:41

а это разве не код?
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>
или вы что то другое имеете в виду?
R.id.team
Политика на форуме запрещена

tanchik
Сообщения: 57
Зарегистрирован: 21 сен 2012, 15:15

Re: HttpSession

Сообщение tanchik » 15 окт 2012, 16:07

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 и ОК.А хотелось бы саму страницу получить, для парсинга. :?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: HttpSession

Сообщение rezak90 » 15 окт 2012, 16:32

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";
        }
    }
R.id.team
Политика на форуме запрещена

tanchik
Сообщения: 57
Зарегистрирован: 21 сен 2012, 15:15

Re: HttpSession

Сообщение tanchik » 15 окт 2012, 16:53

rezak90 писал(а):200 это request код сервера, означает что запрос был удачен.
я понимаю что удачен, только не пойму как из ответа достать код запрашиваемой странички :oops:

вот консоль, если делаю как вы:

Код: Выделить всё

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
Последний раз редактировалось tanchik 15 окт 2012, 17:02, всего редактировалось 2 раза.

Ответить