为啥当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 中检索消息?

为啥在 C++ 中第二次调用析构函数未定义的行为?

为啥第二次调用 glBindBuffer?

当我第二次实例化预制件时,为啥会出现错误?

Android - Singleton Class仅在第二次刷新时更新

为啥函数第一次调用比第二次和第三次调用花费更多的时间等等?