android http请求实现session管理

session一般保存在Cookie当中,首先我们了解一下session和cookie

引自:http://hi.baidu.com/cuihenrychl/item/a08e18268a01461577272ce4

Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力。

Session可以用Cookie来实现,也可以用URL回写的机制来实现。

Cookie和Session有以下明显的不同点:

1)Cookie将状态保存在客户端,Session将状态保存在服务器端;

2)Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies。

3)Session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是不同用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器;

4)就安全性来说:当你访问一个使用session 的站点,同时在自己机器上建立一个cookie,建议在服务器端的SESSION机制更安全些.因为它不会任意读取客户存储的信息。

Session机制

Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。

Session的实现方式

1 ) 使用Cookie来实现

服务器给每个Session分配一个唯一的JSESSIONID,并通过Cookie发送给客户端。

当客户端发起新的请求的时候,将在Cookie头中携带这个JSESSIONID。这样服务器能够找到这个客户端对应的Session。

 2 )使用URL回显来实现

URL回写是指服务器在发送给浏览器页面的所有链接中都携带JSESSIONID的参数,这样客户端点击任何一个链接都会把JSESSIONID带给服务器。
如果直接在浏览器中输入url来请求资源,Session是匹配不到的。

Tomcat对 Session的实现,是一开始同时使用Cookie和URL回写机制,如果发现客户端支持Cookie,就继续使用Cookie,停止使用URL回写。如果发现Cookie被禁用,就一直使用URL回写。jsp开发处理到Session的时候,对页面中的链接记得使用 response.encodeURL() 。

在项目中,我们一般使用HttpClient像如下这样来发起web请求:

DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);

这样当第一次请求完成之后就可以从httpClient中得到cookie
CookieStore cookieStore = httpClient.getCookieStore();
在cookieStore中会带有服务端生成的JSESSIONID
这样,我们可以生成一个全局的静态变量CookieStore,
在第一次请求成功之后,将返回的Cookie保存到这个全局的CookieStore中
完整代码如下:

public static CookieStore cookieStore;
DefaultHttpClient httpClient = new DefaultHttpClient();
httpClient.setCookieStore(cookieStore);
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
if (statusCode == HttpStatus.SC_OK) {
	CookieStore cookieStore = httpClient.getCookieStore();
	cookieStore = cookieStore;
}

这样就可以保证在每次Http请求是带上SESSIONID
在做项目时采用的是android原生+html的混合开发模式,登陆
采用的是android,因此在登陆之后,加载html页面是就要将Cookie放到
WebView中,
采用的方式如下,

if (null != NetUtil.cookieStore) {
				CookieSyncManager.createInstance(getApplicationContext());
				cookieManager = CookieManager.getInstance();
				cookieManager.setAcceptCookie(true);

				cookieManager.removeSessionCookie();
			}
// 在removeSessionCookie()之后要Sleep一段时间,cookie才能set进去,不知道为什么
	SystemClock.sleep(100);
//然后将Cookie存放的CokieManager中
	if (null != NetUtil.cookieStore) {
				List<Cookie> cookies = CRMRemoteHandler.cookieStore
						.getCookies();
				for (int i = 0; i < cookies.size(); i++) {
					Cookie cookie = cookies.get(i);
					String cookieString = cookie.getName() + "="
							+ cookie.getValue() + "; domain="
							+ cookie.getDomain();
					 System.out.println(cookieString);
					cookieManager.setCookie(cookie.getDomain(), cookieString);
				}
				
				CookieSyncManager.getInstance().sync();
				
			}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我之前的回答中提到的 `SessionConfiguration` 是与自然语言处理相关的,与 Android 相机开发无关。如果您要在 Android Camera2 中创建会话(Session),可以使用 `CameraCaptureSession` 类。下面是一个示例代码片段,用于创建一个 `CameraCaptureSession` 对象: ```java private CameraCaptureSession mCameraCaptureSession; private void createCameraSession() { try { Surface surface = mPreviewSurface; mImageReader = ImageReader.newInstance(mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.JPEG, 1); mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mBackgroundHandler); List<Surface> outputSurfaces = new ArrayList<>(); outputSurfaces.add(surface); outputSurfaces.add(mImageReader.getSurface()); mCameraDevice.createCaptureSession(outputSurfaces, mStateCallback, mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } private CameraCaptureSession.StateCallback mStateCallback = new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { mCameraCaptureSession = cameraCaptureSession; try { mCameraCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), null, mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { Log.e(TAG, "onConfigureFailed: CameraCaptureSession configuration failed"); } }; ``` 在上面的代码中,我们使用 `CameraDevice` 的 `createCaptureSession()` 方法来创建一个会话。我们在 `createCaptureSession()` 方法中指定了要输出的 `Surface` 列表,包括预览 `Surface` 和图像读取器 `Surface`。在 `onConfigured()` 方法中,我们将创建的 `CameraCaptureSession` 对象保存在变量 `mCameraCaptureSession` 中,并将预览请求设置为重复请求,这样就可以实时预览相机输出了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值