----------------------------------------------------------------------------------------------------
HTTP的状态管理
由于基于Http协议的请求是无状态的,所以
服务端无法把同一个客户端发送的多次请求
当成一个整体来看待。但是我们有一些需求
需要服务端把同一个客户端发送的多次请求
当成一个整体。比如:登录-->购买
如何实现Http的状态管理?
1>
Cookie机制 (把涉及到的数据保存在客户端)
2>
Session机制(把涉及到的数据保存在服务端)
Cookie机制的执行原理:
1>客户端向服务端发送http请求,服务端
返回给客户端响应数据,并且在响应数据包
中携带cookie信息:
Set-Cookie: cishu=10
2>客户端接收响应数据包,解析响应,获取
cookie信息,并且把cishu=10保存在客户端
中。
3>在客户端发送后续请求时,需要在请求
数据包中携带cookie信息:
Cookie:cishu=10
4>服务端接收请求,并且解析请求数据包中
的cookie信息,执行后续业务。
Cookie的限制:
Cookie不能存储中文
Cookie不能存储大数据量数据
Cookie不安全
Session机制的实现原理:
1>客户端发送http请求,服务端把需要
保存的数据保存在session对象中,并且
把JSID以Cookie的方式传递给客户端:
Cookie: JSESSIONID=ABCDEFG
2>客户端接收服务端响应数据包,并且把
Cookie保存在客户端中。
3>客户端发送后请求时,需要在请求数据包
中以cookie的形式传递JSESSIONID:
Cookie:JSESSIONID=ABCDEFG
4>服务端接收客户端的请求,并且获取JSESSIONID,
通过JSESSIONID获取以前分配的session对象
获取保存过的数据。实现状态管理。
EMS项目之验证码
验证码的作用:
防止机器人恶意攻击服务器。
注册业务:
1>RegistActivity XML
在登录界面中点击注册跳转到该activity
2>点击注册按钮,发送http请求。
3>解析响应json字符串。
4>成功: finish()
失败: 提示错误
Activity反向传值:
LoginAcitivty --> RegistActivity
当RegistActivity销毁时,回传给LoginAcitivity
一些参数。
实现:
1>LoginActivity:
startAcitivityForResult()
2>RegistAcitivty:
setResult()
3>LoginActivity:
@Override
onActivityResult(reqCode,resCode,data){
}
--------------------------------------------------------------------------------------------------
//声明的常量
public static final int HANDLER_LOAD_IMAGE_CODE_SUCCESS=1;
public static final int HANDLER_LOGIN_SUCCESS=2;
public static final int HANDLER_LOGIN_FAIL=3;
private static final int REQUEST_CODE_GO_TO_REGIST = 100;
-----------------------------------------------------------------------------------------------------------
//在登录界面,点击注册按钮
public void doClick(View view){
switch (view.getId()) {
case R.id.btnRegist: //跳转注册界面
Intent intent = new Intent(this, RegistActivity.class);
//启动Activity
//启动该Activity是为了获取对方回传的数据
//startActivityForResult(intent, REQUEST_CODE_GO_TO_REGIST);
startActivityForResult(intent, REQUEST_CODE_GO_TO_REGIST);
break;
-------------------------------------------------------------------------------------------------------------------------
//在注册界面,注册成功后,把数据回传给登录界面
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case HANDLER_REGIST_FAIL: //注册失败
Toast.makeText(RegistActivity.this, "遗憾, "+msg.obj, Toast.LENGTH_SHORT).show();
break;
case HANDLER_REGIST_SUCCESS:
//注册成功
Toast.makeText(RegistActivity.this, "恭喜,注册成功 ", Toast.LENGTH_SHORT).show();
//finish之前 回传给LoginActivity两个参数
// loginname password
String name=etName.getText().toString();
String pwd=etPwd.getText().toString();
//调用setResult方法
//把两个参数设置到intent中即可
Intent data=new Intent();
data.putExtra("name", name);
data.putExtra("pwd", pwd);
//setResult(RESULT_OK, data);
setResult(RESULT_OK, data)
finish();
break;
}
}
};
--------------------------------------------------------------------------------------------
/**
* 父类的方法
* startActivityForResult()
* 当RegistActivity finish()后 将会自动调用
* 该onActivityResult方法。
* @param requestCode 请求码
* @param resultCode 结果码
* @param data 回传数据
*/
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_CODE_GO_TO_REGIST:
//判断注册是否成功 如果注册成功
if(resultCode==RESULT_OK){
//则获取data中的账号和密码 动态设置到EditText中
String name=data.getStringExtra("name");
String pwd=data.getStringExtra("pwd");
etName.setText(name);
etPwd.setText(pwd);
}
break;
}
}
-------------------------------------------------------------------------------------------------