В моем сервлете У меня есть такой метод:
private void showUserReservations(HttpServletRequest request, HttpServletResponse response) throws IOException, SQLException, ServletException {
String username = null;
HttpSession session = request.getSession();
if (session.getAttribute("loggedUser") != null) {
username = (String) session.getAttribute("loggedUser");
}
// get data from DB
List<Operation> userReservations = operationsDbUtil.getUserReservations(username);
if (userReservations != null) {
request.setAttribute("AVAILABLE_DATA", userReservations);
response.getWriter().write(gson.toJson(userReservations));
}
}
Я должен получить эти данные в моем приложении для Android , чтобы заполнить ListView, который находится во фрагменте. Если я запускаю свой код Android для метода, который не нуждается в атрибуте сеанса, данные принимаются правильно. Проблема возникает, когда я запускаю этот метод showUserReservations (), потому что сервлет не может получить атрибут loggedUser.
Следуя этому руководству Общие настройки, чтобы сохранить пользователя вошедшим в систему Я поддерживаю своего пользователя в системе, используя общие настройки, но как я могу сообщить сервлету, какой пользователь делает запрос? Есть ли способ отправить мое имя пользователя, которое сохраняется в общих настройках , поэтому эта часть кода
if (session.getAttribute("loggedUser") != null) {
username = (String) session.getAttribute("loggedUser");
}
может работать правильно?
код Android, который связывается с сервлетом
private String strUrl = null;
private String jsonString = null;
View view;
ListView listView;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_my_reservations, container, false);
Button btn = view.findViewById(R.id.jsonBtn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showJson(view);
}
});
return view;
}
public void showJson(View view) {
new FillListTask().execute();
}
public class FillListTask extends AsyncTask<Void, Void, String> {
@Override
protected void onPreExecute() {
strUrl = "http://xxx.xxx.x.x./xxxxxxxxxxx;
}
@Override
protected void onPostExecute(String result) {
TextView textView = view.findViewById(R.id.tvJson);
textView.setText(result);
}
@Override
protected String doInBackground(Void... voids) {
try {
URL url = new URL(strUrl);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("GET");
httpURLConnection.connect();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder();
while ((jsonString = bufferedReader.readLine()) != null) {
stringBuilder.append(jsonString + "\n");
}
bufferedReader.close();
inputStream.close();
httpURLConnection.disconnect();
return stringBuilder.toString().trim();
} catch (IOException exception) {
System.out.println(exception.getMessage());
}
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
}
}
Таким образом, я могу получать данные из сервлета из методов, которые не требуют атрибута сеансов.