一、实现步骤:
(1)创建一个类(类的名字进行自定义)
(2)把类进行使用单例模式进行封装,并使用HttpClient进行获取请求登录接口的Cookie,以及登录后返回的json数据
(3)将cookie保存到SharedPreferences中,进行封装SharedPreferencesUtils工具类,保存成永久的cookie
(4)传入登录接口,用户名和密码(使用post请求进行提交为了安全起见)
(5)得到登录返回的响应码(code值判断是否是登录成功,还是登录失败)
(6)当登录成功后跳转到主页面,主页面功能是由Html5进行编写的
(7)在加载Html5页面之前进行设置登录接口中获取的cookie
(8)进行加载Html页面网址,设置与JavaScript可以交互
二:具体的代码操作进行来实现
(1)创建一个类(类的名字进行自定义)
创建了一个类,名字叫做HttpCookie
(2)把类进行使用单例模式进行封装,并使用HttpClient进行获取请求登录接口的Cookie,以及登录后返回的json数据
//初始化对象
public static volatile HttpCookie httpCookie;
private static HttpClient httpClient;
private HttpCookie() {
//获取HttpClient对象
httpClient = new DefaultHttpClient();
}
/**
* 使用单例模式获取对象
*
* @return
*/
public static HttpCookie getInstance() {
if (httpCookie == null) {
synchronized (HttpCookie.class) {
if (httpCookie == null) {
httpCookie = new HttpCookie();
}
}
}
return httpCookie;
}
/**
* 获取登录信息
*
* @param loginname 输入的用户名
* @param password 输入的密码
*/
public static String post(Context context, String url, String loginname, String password) {
//post请求方式
HttpPost httpPost = new HttpPost(url);
//创建集合
List<NameValuePair> list = new ArrayList<>();
//添加属性
list.add(new BasicNameValuePair("loginName", loginname));
list.add(new BasicNameValuePair("password", password));
try {
//将属性设置到请求中
httpPost.setEntity(new UrlEncodedFormEntity(list));
//得到HttpResponse对象,获取到响应的结果
HttpResponse response = httpClient.execute(httpPost);
if (response.getStatusLine().getStatusCode() == 200) {
//得到AbstractHttpClient对象
AbstractHttpClient abstractHttpClient = (AbstractHttpClient) httpClient;
//得到List<Cookie>
List<Cookie> cookies = abstractHttpClient.getCookieStore().getCookies();
for (Cookie cookie : cookies) {
String s = cookie.getName() + "=" + cookie.getValue() + " ; domain=" + cookie.getDomain();
Log.d("tag", "post: " + s);
Log.d("tag", "post: " + "name=" + cookie.getName() + "value=" + cookie.getValue());
//把获取的cookie存到 SharedPreferences 中
SharedPreferencesUtils.saveStr(context, "cookie", s);
//设置请求头
httpPost.setHeader("Cookie", cookie.getName() + "=" + cookie.getValue());
}
//得到HttpEntity对象
HttpEntity entity = response.getEntity();
//得到内容
String content = EntityUtils.toString(entity);
Log.d("tag", "content: " + content);
//返回请求后的结果
return content;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
(3)将cookie保存到SharedPreferences中,进行封装SharedPreferencesUtils工具类,保存成永久的cookie
进行封装SharedPreferencesUtils工具类
public class SharedPreferencesUtils {
/**
* 保存对象
* @param context
* @param key
* @param value
*/
public static void saveStr(Context context,String key, String value){
//得到SharedPreferences对象
SharedPreferences cookie = context.getSharedPreferences("cookie", Context.MODE_PRIVATE);
//得到Editor对象
SharedPreferences.Editor edit = cookie.edit();
//放入数据
edit.putString(key,value);
edit.commit();
}
/**
* 获取对象
* @param context
* @param key
* @return
*/
public static String getStr(Context context,String key){
//得到SharedPreferences对象
SharedPreferences cookie = context.getSharedPreferences("cookie", Context.MODE_PRIVATE);
String cookieString = cookie.getString(key, "");
return cookieString;
}
}
(4)传入登录接口,用户名和密码(使用post请求进行提交为了安全起见)
登录按钮监听里的内容
//用户名
user = et_you_user.getText().toString().trim();
//密码
pwd = et_you_pwd.getText().toString().trim();
if (TextUtils.isEmpty(user)) {
Toast.makeText(this,"用户名不能为空",Toast.LENGTH_SHORT).show();
return;
}
if (TextUtils.isEmpty(pwd)) {
Toast.makeText(this,"密码不能为空",Toast.LENGTH_SHORT).show();
return;
}
//进行获取数据,传入的用户名和密码
getData(user,pwd);
获取数据的方法
/**
* 获取请求登录成功后返回的数据
* @param user 用户名
* @param pwd 密码
*/
private void getData(final String user, final String pwd) {
new Thread(){
@Override
public void run() {
super.run();
//获取到请求后的数据 参数一: 请求的网址 参数二:用户名 参数三 : 密码
String content = HttpCookie.post(MainActivity.this, "http://192.168.1.13:8080/learner/login.do", user, pwd);
//得到解析数据
LoginBean loginBean = MyApplication.gsonUtils.gsonToBean(content, LoginBean.class);
(5)得到登录返回的响应码(code值判断是否是登录成功,还是登录失败)
//得到请求码
String code = loginBean.getCode();
//得到消息
String msg = loginBean.getMsg();
Message message = Message.obtain();
message.what=Integer.valueOf(code);
message.obj=msg;
mainhandler.sendMessage(message);
}
}.start();
}
(6)当登录成功后跳转到主页面,主页面功能是由Html5进行编写的
class MainHandler extends Handler{
//开启一个弱引用
WeakReference<Activity> mActivityReference;
MainHandler(Activity activity){
mActivityReference= new WeakReference<Activity>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//得到当前的activity
Activity activity = mActivityReference.get();
if (activity != null){
//得到请求码
int code = msg.what;
String meessage= (String) msg.obj;
switch (code){
//登录成功
case 0:
Toast.makeText(activity,meessage,Toast.LENGTH_SHORT).show();
Intent intent = new Intent(activity,SecondActivity.class);
startActivity(intent);
break;
//登录失败
case 1:
Toast.makeText(activity,meessage,Toast.LENGTH_SHORT).show();
break;
}
}
}
}
(7)在加载Html5页面之前进行设置登录接口中获取的cookie
我这里是SecondActivity,进行设置cookie的操作
/**
* 设置cookie
*/
private void setWebviewCookie() {
//得到Cookie对象
String cookie = SharedPreferencesUtils.getStr(this, "cookie");
Log.d("tag", "setWebviewCookie: "+cookie);
CookieSyncManager.createInstance(this);
//得到CookieManager对象
CookieManager cookieManager = CookieManager.getInstance();
//移除当前的消息
cookieManager.removeAllCookie();
//设置支持cookie
cookieManager.setAcceptCookie(true);
//进行设置cookie 参数一:登录接口的网址 参数二: 获取的cookie
cookieManager.setCookie("http://192.168.1.13:8080/learner/login.do",cookie);
//进行开始同步操作
CookieSyncManager.getInstance().sync();
}
(8)进行加载Html页面网址,设置与JavaScript可以交互
1、找到控件的id
/**
* 初始化控件视图
*/
private void initview() {
webview = (WebView) findViewById(R.id.webview);
}
2、加载网址,并进行可以与JavaScript交互
webview.loadUrl("http://192.168.1.13:8080/learner/html/main.html");
WebSettings settings = webview.getSettings();
settings.setJavaScriptEnabled(true);
这样,就完成了与服务器进行共享(同步)cookie的操作