Страницы

Поиск по вопросам

воскресенье, 7 июля 2019 г.

Авторизация на сервере через POST HTTP-запрос с Android

Пишется приложение на Android для сервера WildFly. Со стороны сервера вход под своим логином и паролем на сайт со страницы авторизации выглядит так:
@WebServlet(name = "LoginServlet", urlPatterns = "/login.do") public class LoginServlet extends HttpServlet{ SecurityManager sm = new SecurityManager();
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) { String email = request.getParameter("email").toLowerCase(); String pass = request.getParameter("pass");
if (sm.checkUser(email, pass)){ request.getSession().setAttribute("user", email); response.sendRedirect(request.getContextPath() + "/testpage"); } else { response.sendRedirect(request.getContextPath()); } } }
Также есть WebFilter, не пускающий на /testpageпользователя, если у сессии нет атрибута user. Это достигается следующим методом в классе LogiFilter
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; HttpSession session = request.getSession(false); boolean loggedIn = session != null && session.getAttribute("user") != null;
if (loggedIn) { chain.doFilter(request, response); } else { response.sendRedirect(request.getContextPath()); } }
При попытке осуществления авторизации через браузер сервер адекватно отрабатывает согласно имеющейся в БД паре log | pass. В зависимости от выданного атрибута user на дочерней странице /testpage отображается соответствующая авторизованному пользователю информация.
Тем не менее, при попытке авторизации с приложения Android несмотря на отправку методом POST верной (не верной в том числе) пары log | pass атрибут user не закрепляется, из-за чего происходит редирект со страницы /testpage на страницу авторизации. Код осуществления POST-запроса:
private class PostTask extends AsyncTask { @Override protected String doInBackground(String... data) { final String USER_AGENT = "Mozilla/5.0";
try { StringBuilder tokenUri = new StringBuilder("email="); tokenUri.append(URLEncoder.encode("email", "UTF-8")); tokenUri.append("&pass="); tokenUri.append(URLEncoder.encode("password", "UTF-8"));

String url = "http://xxx.xxx.xxx.xxx:xxxxx/sendmsg/login.do"; URL obj = new URL(url); //HttpURLConnection.setFollowRedirects(false); HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST"); con.setRequestProperty("User-Agent", USER_AGENT); con.setRequestProperty("Accept-Language", "UTF-8"); //con.setInstanceFollowRedirects(false);
con.setDoOutput(true); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(con.getOutputStream()); outputStreamWriter.write(tokenUri.toString()); outputStreamWriter.flush();
int responseCode = con.getResponseCode(); System.out.println("
Sending 'POST' request to URL : " + url); System.out.println("Post parameters : " + tokenUri); System.out.println("Response Code : " + responseCode); System.out.println("Response Body : " + con.getResponseMessage());
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) { response.append(inputLine); }; in.close();
System.out.println(response.toString());
}catch (Exception e){e.printStackTrace();} return null; }
@Override protected void onPostExecute(String s) { //new GetTask().execute(); super.onPostExecute(s); } }
При использовании параметра HttpURLConnection.setFollowRedirects(false); редирект не производится, а response code становится равным 307 (Temporary Redirect). При попытке получить GET-запросом /testpage приходит response code 302 (Found). При включении редиректа в любом случае приходит страница авторизации.
Не исключено, что требуется ручное присвоение сессии атрибутов или использование cookie.


Ответ

Да, вы верно подметили, HttpURLConnection сам сессиями и куками не занимается, ему их надо каждый раз выставлять.
Как пример, можете посмотреть образец кода на enSO: https://stackoverflow.com/a/16171708/5479247

Комментариев нет:

Отправить комментарий