Пишется приложение на 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
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
Комментариев нет:
Отправить комментарий