对于非浏览器的设备,不保存会话

时间:2014-04-12 10:03:14

标签: java android rest session tomcat

我有一个tomcat服务器,我将它用作一个宁静的服务器。

对于每个休息请求,我需要提供一个令牌。一旦提供了toke,我将其存储在会话中。问题是当我通过浏览器URL检查一些请求保存在会话中的令牌时,但是当我通过某个客户端(在我的情况下是android应用程序)中执行此操作时,它总是创建新会话。似乎来自同一客户端的每个请求都是作为来自不同客户端的请求处理的。

我需要在tomcat中配置一些东西吗?为什么我为同一个客户端获取新会话(当客户端不是浏览器时?

谢谢!

1 个答案:

答案 0 :(得分:2)

在第一次请求时,您的容器通常会告诉客户端通过如下标题设置Cookie:

Set-Cookie: JSESSIONID=03f52fcdccdfd070be0ada8dw14b;

如果客户想要加入此会话,则必须将此Cookie与每个请求一起传递回服务器。您的浏览器会自动为您执行此操作。其他客户可能没有。 如果没有此Cookie信息,您的Android应用程序的每个呼叫都是服务器的新功能。

使用Cookie java.net.URLConnection

的简单示例
URLConnection connection = new URL(loginUrl).openConnection();
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
connection.setDoOutput(true);
Map<String, String> formParams = new HashMap<String, String>();
formParams.put("username", "John"); // add your login Params
StringBuilder encodedParams = new StringBuilder();
for (Map.Entry<String, String> param : formParams.entrySet()) {
    encodedParams
        .append(URLEncoder.encode(param.getKey(), "UTF-8"))
        .append('=')
        .append(URLEncoder.encode(param.getValue(), "UTF-8"));
}
OutputStream outputStream = connection.getOutputStream();
outputStream.write(encodedParams.toString().getBytes("UTF-8"));

List<String> cookies = connection.getHeaderFields().get("Set-Cookie");
String sessionCookie = null;
for (String cookie : cookies) {
    if (cookie.startsWith("JSESSIONID")) {
        sessionCookie = cookie.substring(0, cookie.indexOf(';')); // drop path, expires etc.
    }
}

// reuse cookie for next page
connection = new URL(nextUrl).openConnection();
connection.addRequestProperty("Cookie", sessionCookie);
connection.getInputStream();

无关:Restful应用程序通常是无状态的,意味着不基于会话状态。