为啥当android在java中调用第二次Web服务时会创建新的会话
Posted
技术标签:
【中文标题】为啥当android在java中调用第二次Web服务时会创建新的会话【英文标题】:Why session is create new when android call second time web service in java为什么当android在java中调用第二次Web服务时会创建新的会话 【发布时间】:2014-04-24 12:40:36 【问题描述】:这是一个 java web 服务方法,当 android 用户第二次调用时我们会得到一个新的 session id。那么如何解决呢? 我们在 android 客户端登录时创建了新的 sessionId,然后他们在 json 字符串中发送了相同的 sessionId,即使每次都会生成一个新的 sessionId。
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriInfo;
import com.bis.gauizz.utils.JsonUtil;
@Path("/Service")
public class WebService
@GET
@Path("/Text")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String getDataText()
System.out.println("in getDataText Method");
return "in getDataText Method";
@GET
@Path("/Json")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@HeaderParam("User-Agent")
public String getDataJson(@Context UriInfo request,
@Context HttpServletRequest req) throws InvalidKeyException,
NoSuchAlgorithmException, InvalidKeySpecException,
NoSuchPaddingException, InvalidAlgorithmParameterException,
UnsupportedEncodingException, IllegalBlockSizeException,
BadPaddingException
String returnJson = null;
//User Agent
String userAgent = req.getHeader("User-Agent").toString();
System.out.println(userAgent);
// Create sessionID
HttpSession idSession = null;
if(req.getSession(false) == null)
idSession = req.getSession();
if(idSession.isNew())
System.out.println("New SessionId");
else
System.out.println("Old SessionId");
idSession = req.getSession(true);
else
//To check SessionId is new Or not
if (idSession != null)
request.getQueryParameters().get("json");// most impotent
JsonUtil jsonUtil = new JsonUtil();
returnJson = jsonUtil.getJson(request.getQueryParameters()
.get("json"), idSession);
return returnJson;
【问题讨论】:
【参考方案1】:确保您使用来自客户端的相同连接/HTTPClient,重新发送服务器发送的 cookie 以响应第一个请求。否则将为每个请求生成一个新会话。
【讨论】:
另外,您可能不应该为您的 WS 使用会话。它们应该是无状态的,并且您应该每次都进行身份验证。否则自动化测试将非常困难。 正如@MikkelLøkke 所说,如果您不在 WS/REST 中使用 HTTP 级别的会话,这是最简单的,但如果您想这样做,是的,它似乎没有任何问题. 其他选项是什么? 如果您没有在会话中存储大量状态,您可以 a) 对每个请求重新进行身份验证,或者 b) 拥有一个代表会话的短期令牌;您明确在调用中传递它,它是 API 的一部分。 “完美”是主观的,因此取决于您的要求。你打算如何扩展它?它是一种高可用性 Web 服务吗?如果你有一个无状态的 WS,(如果你是 RESTful,这是一种要求)可扩展性更容易。投入负载均衡器,工作完成!如果您需要分布式会话或会话复制/同步,事情会变得有些复杂。所以“这取决于”。有很多事情需要考虑。此外,它是一个电话应用程序,您可能需要处理网络连接问题。如果 WS 是无状态的,这会更容易。编码愉快。以上是关于为啥当android在java中调用第二次Web服务时会创建新的会话的主要内容,如果未能解决你的问题,请参考以下文章
为啥第二次调用接收没有在 Erlang shell 中检索消息?