php实现网页ios登陆记忆,UIWebView登陆需要记住用户名和密码下次自动登陆。(iOS UIWebView 通过 cookie 完成自动登录。)...

怪我咯2017-04-17 17:34:114楼

一般情况下登陆后希望记住登陆状态的实现并不是记住密码,因为这样是不安全的。我的做法是在cookie中保存登录状态,然后登录时将cookie传给app,app将这个cookie保存到本地,下一次访问网络的时候就带上这个cookie。

这里有两个主要的问题,

如何保存和读取cookie

如何访问网络时带上cookie

因为中午了先睡个觉题主需要的话我晚一点回来补充

好了,我回来继续补充答案。

关于为什么能用cookie来保存登陆状态,这个是后台人员的事情,在这里暂且不介绍,题主需要的话自行查找相关资料。

这里以Java为例,提供一个简单的Demo,便于理解使用cookie

这个demo做了以下事情

向某个页面发起post请求。

设置了请求需要的一些参数,比如说字符集、Content-type、超时时间等等。

在请求中带上cookie(注意:首次请求cookie是空的,这一步在首次请求后,获取cookie后才有效果)

connection.connect();后,使用connection.getHeaderField("Set-Cookie");就能获取服务器传过来的Cookie,注意,这里的cookie就是一个字符串而已。没什么特别的。

输出其他一些请求头的参数等等(这个主要是在调试的时候用的。)

这段代码可以直接在android开发中使用。当然实际开发中我们并不会这么用,这是后话。

/**

* Created by cocbin on 2015/12/7.

*/

import java.io.*;

import java.net.URL;

import java.net.URLConnection;

import java.util.List;

import java.util.Map;

public class main {

public static void main(String args[]) {

//向一个页面发起请求

String result = Post("http://test.com/");

System.out.println(result);

}

private static String KEY_CHARSET = "utf-8";

private static String cookie = "";

private static String Post(String murl) {

OutputStream outputStream = null;

OutputStreamWriter outputStreamWriter = null;

try {

URL url = new URL(murl);

URLConnection connection = url.openConnection();

connection.setDoOutput(true);

connection.setConnectTimeout(10000);

connection.setReadTimeout(10000);

connection.addRequestProperty("Content-type", "text/html");

//这里所谓请求的时候带上Cookie

connection.setRequestProperty("Cookie", cookie);

outputStream = connection.getOutputStream();

outputStreamWriter = new OutputStreamWriter(outputStream, KEY_CHARSET);

BufferedWriter bw = new BufferedWriter(outputStreamWriter);

bw.flush();

connection.connect();

//这里就是获得请求传过来的Cookie

if (connection.getHeaderField("Set-Cookie") != null) {

cookie = connection.getHeaderField("Set-Cookie");

}

System.out.println("cookie="+cookie);

Map> headers = connection.getHeaderFields();

for (Map.Entry> entry : headers.entrySet()) {

System.out.println(entry.getKey() + " : ");

for (String value : entry.getValue()) {

System.out.println(value + " , ");

}

}

System.out.println("----------");

System.out.println("getContentType: " + connection.getContentType());

System.out.println("getContentLength: " + connection.getContentLength());

System.out.println("getContentEncoding: " + connection.getContentEncoding());

System.out.println("getDate: " + connection.getDate());

System.out.println("getExpiration: " + connection.getExpiration());

System.out.println("getLastModifed: " + connection.getLastModified());

System.out.println("----------");

InputStream is = connection.getInputStream();

InputStreamReader inputStreamReader = new InputStreamReader(is, KEY_CHARSET);

BufferedReader br = new BufferedReader(inputStreamReader);

String line = null;

StringBuffer result = new StringBuffer();

while ((line = br.readLine()) != null) {

result.append(line);

}

outputStream.close();

outputStreamWriter.close();

is.close();

inputStreamReader.close();

br.close();

return result.toString();

} catch (IOException e) {

e.printStackTrace();

return null;

}

}

}

通过上面这个post请求的代码,我们就能做到,每一次请求的cookie都是一致的了。也就是说,我们第一次向服务器发起请求时,cookie是空的,于是服务器给你生成一个cookie,传到客户端,客户端获取cookie(注意,这时候cookie是保存在内存里面的)。在此请求的时候,cookie里面是有值的,这个是通过connection.setRequestProperty("Cookie", cookie);传给服务器。这样子服务器就能够识别用户了。

当然,到了这里,cookie是保存在内存里面的,当程序退出后,内存里面保存的内容是会被清除的,所以,我们要想办法让他不清除,所以就要进行本地保存了。

我们前面提过,cookie只是个普通的字符串,没什么特别。

保存一个字符串而已这能难道到我们吗,大不了直接写个txt文件不就好了是吧。当然在移动开发中我们并不会这么做,因为移动平台给我们很好的api。

下面分别介绍android和ios的本地保存api。

Android

Android保存一般是使用SharedPreferences,保存的代码如下:( Global.context表示一个Context对象)

具体请自行搜索相关文档

SharedPreferences preferences =

Global.context.getSharedPreferences("PREFER_COOKIE", Context.MODE_PRIVATE);

SharedPreferences.Editor editor = preferences.edit();

editor.putString("PREFER_COOKIE", cookie);

editor.apply();

然后是读取

SharedPreferences preferences =

Global.context.getSharedPreferences("PREFER_COOKIE", Context.MODE_PRIVATE);

cookie= preferences.getString("PREFER_COOKIE", "");

然后是清除(退出登录状态)

SharedPreferences preferences =

Global.context.getSharedPreferences("PREFER_COOKIE", Context.MODE_PRIVATE);

SharedPreferences.Editor editor = preferences.edit();

editor.clear().apply();

iOS

这里我封装了一个类,

头文件:

//

// CocCache.h

// caoaman

//

// Created by cocbin on 15/11/10.

// Copyright © 2015年 cocbin. All rights reserved.

//

#import

@interface CocCache : NSObject

+ (void)saveCache:(NSString *)key value:(NSString *)value;

+ (NSString *)getCache:(NSString *)key;

+ (void)clearCache:(NSString *)key;

@end

实现文件

//

// CocCache.m

// caoaman

//

// Created by cocbin on 15/11/10.

// Copyright © 2015年 cocbin. All rights reserved.

//

#import "CocCache.h"

@implementation CocCache

+ (void)saveCache:(NSString *)key value:(NSString *)value

{

NSUserDefaults * setting = [NSUserDefaults standardUserDefaults];

[setting setObject:value forKey:key];

[setting synchronize];

}

+ (NSString *)getCache:(NSString *)key

{

NSUserDefaults * settings = [NSUserDefaults standardUserDefaults];

NSString *value = [settings objectForKey:key];

return value;

}

+ (void)clearCache:(NSString *)key

{

NSUserDefaults * settings = [NSUserDefaults standardUserDefaults];

[settings removeObjectForKey:key];

[settings synchronize];

}

@end

具体用法看命名就知道了,就是普通的键值对保存。

最后是实现

好了,现在知道cookie是怎么回事了,也知道怎么本地保存了,接下来总结一下整个逻辑

首先打开应用

读取本地cookie(发现没有内容,表示未登录)

发起登陆请求

获取cookie

保存cookie到本地。

再次打开应用

读取本地cookie(存在一个字符串,还不能确定是否登陆)

带上cookie请求用户信息(能获取信息,表示用户登录了。这里需要后台提供一个获取用户信息的api)

在实际开发中,我们一般使用的网络框架是第三方框架,有些框架是自带保存cookie功能的。具体要看框架的文档了。

最后说一下,验证用户登录不一定是使用cookie,也可以用token或其他方式验证。这个就看后台怎么设计了。但是不管是cookie还是token,原理都是一样的。发起请求->获取标识(token或cookie等等) ->保存表示,下一次打开应用的时候,读取表示,再次请求带上标识。就这么简单。 如果用户要退出登录,只要清除内存中和本地保存的表示就行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 目标检测的定义 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。 目标检测任务可分为两个关键的子任务,目标定位和目标分类。首先检测图像中目标的位置(目标定位),然后给出每个目标的具体类别(目标分类)。输出结果是一个边界框(称为Bounding-box,一般形式为(x1,y1,x2,y2),表示框的左上角坐标和右下角坐标),一个置信度分数(Confidence Score),表示边界框中是否包含检测对象的概率和各个类别的概率(首先得到类别概率,经过Softmax可得到类别标签)。 1.1 Two stage方法 目前主流的基于深度学习的目标检测算法主要分为两类:Two stage和One stage。Two stage方法将目标检测过程分为两个阶段。第一个阶段是 Region Proposal 生成阶段,主要用于生成潜在的目标候选框(Bounding-box proposals)。这个阶段通常使用卷积神经网络(CNN)从输入图像中提取特征,然后通过一些技巧(如选择性搜索)来生成候选框。第二个阶段是分类和位置精修阶段,将第一个阶段生成的候选框输入到另一个 CNN 中进行分类,并根据分类结果对候选框的位置进行微调。Two stage 方法的优点是准确度较高,缺点是速度相对较慢。 常见Tow stage目标检测算法有:R-CNN系列、SPPNet等。 1.2 One stage方法 One stage方法直接利用模型提取特征值,并利用这些特征值进行目标的分类和定位,不需要生成Region Proposal。这种方法的优点是速度快,因为省略了Region Proposal生成的过程。One stage方法的缺点是准确度相对较低,因为它没有对潜在的目标进行预先筛选。 常见的One stage目标检测算法有:YOLO系列、SSD系列和RetinaNet等。 2 常见名词解释 2.1 NMS(Non-Maximum Suppression) 目标检测模型一般会给出目标的多个预测边界框,对成百上千的预测边界框都进行调整肯定是不可行的,需要对这些结果先进行一个大体的挑选。NMS称为非极大值抑制,作用是从众多预测边界框中挑选出最具代表性的结果,这样可以加快算法效率,其主要流程如下: 设定一个置信度分数阈值,将置信度分数小于阈值的直接过滤掉 将剩下框的置信度分数从大到小排序,选中值最大的框 遍历其余的框,如果和当前框的重叠面积(IOU)大于设定的阈值(一般为0.7),就将框删除(超过设定阈值,认为两个框的里面的物体属于同一个类别) 从未处理的框中继续选一个置信度分数最大的,重复上述过程,直至所有框处理完毕 2.2 IoU(Intersection over Union) 定义了两个边界框的重叠度,当预测边界框和真实边界框差异很小时,或重叠度很大时,表示模型产生的预测边界框很准确。边界框A、B的IOU计算公式为: 2.3 mAP(mean Average Precision) mAP即均值平均精度,是评估目标检测模型效果的最重要指标,这个值介于0到1之间,且越大越好。mAP是AP(Average Precision)的平均值,那么首先需要了解AP的概念。想要了解AP的概念,还要首先了解目标检测中Precision和Recall的概念。 首先我们设置置信度阈值(Confidence Threshold)和IoU阈值(一般设置为0.5,也会衡量0.75以及0.9的mAP值): 当一个预测边界框被认为是True Positive(TP)时,需要同时满足下面三个条件: Confidence Score > Confidence Threshold 预测类别匹配真实值(Ground truth)的类别 预测边界框的IoU大于设定的IoU阈值 不满足条件2或条件3,则认为是False Positive(FP)。当对应同一个真值有多个预测结果时,只有最高置信度分数的预测结果被认为是True Positive,其余被认为是False Positive。 Precision和Recall的概念如下图所示: Precision表示TP与预测边界框数量的比值 Recall表示TP与真实边界框数量的比值 改变不同的置信度阈值,可以获得多组Precision和Recall,Recall放X轴,Precision放Y轴,可以画出一个Precision-Recall曲线,简称P-R
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值