1

Server-side I have an HttpSession object. Each time the client starts the connection to the Servlet, the session changes. Here I have a simplified version of my Servlet code:

//import ...

@WebServlet(name = "ServletController", urlPatterns = {"/ServletController"})
public class ServletController extends HttpServlet {

    public void init(ServletConfig conf) {
        //...
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //...
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/plain");
        HttpSession s = request.getSession();

        PrintWriter out = response.getWriter();
        try {
            String action = request.getParameter("action");
            switch (action) {
                case "login":
                    s.setAttribute("account", "John");
                    out.println("Logged in successfully. Session: " + s);
                    out.flush();
                    break;

                case "account":
                    String account = (String) s.getAttribute("account");
                    out.println(account + ". Session: " + s);
                    out.flush();
                    break;

                default:
                    break;
            }
        } catch (Exception x) {
            System.out.println(x);
        }
    }
}

And here the simplified Android one:

//import ...

public class Operation {
    public static Executor e = Executors.newSingleThreadExecutor();

    public static void main(String[] args) {
        Button login_btn = findViewById(R.id.login);
        Button account_btn = findViewById(R.id.account);

        login_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                e.execute(() -> {
                    String login = Operation.operation("?action=login");
                });
            }
        });

        account_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                e.execute(() -> {
                    String account = Operation.operation("?action=account");
                });
            }
        });

        System.out.println(login);
        System.out.println(account);
    }

    public static String operation(String urlParameters) {
        HttpURLConnection conn = null;
        try {
            System.out.println(urlParameters);
            URL url = new URL("http://10.0.2.2:8080/progettoTweb/ServletController" + urlParameters);
            conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(1000);
            conn.setConnectTimeout(1500);
            conn.setRequestMethod("GET");
            conn.setDoInput(true);
            conn.connect();
            int response = conn.getResponseCode();
            return readIt(conn.getInputStream());
        } catch (Exception ex) {
            System.out.println(ex);
            return null;
        } finally {
            if (conn != null) {
                conn.disconnect();
            }
        }
    }

    //building the output as a String
    private static String readIt(InputStream stream) throws IOException, UnsupportedEncodingException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
        String line;
        StringBuilder result = new StringBuilder();
        while ((line = reader.readLine()) != null) {
            result.append(line).append("\n");
        }
        return result.toString();
    }
}

As the System.out.println in the Android app show, I obtain a different session for each Operation.operation call I make. In the original code I use SharedPreferences in order to save my data, but it does not solve the problem since I do not know how to use the session, gained from the interaction with the server-side, to obtain the required values. Indeed, in the Servlet code I use s.getAttribute() but, since it creates a new HttpSession object each time, It cannot give back the requested values.

  • The servlet usually responds with a cookie (whose name is JSESSION_ID) whenever a session is created first time. You will have to parse the response for cookies, obtain the session cookie and send it in subsequent requests. If a valid session cookie is present, the server will not create a new one. – ramp Mar 30 '21 at 07:01

0 Answers0