设备指纹系列--前端篇

news/2024/5/20 2:47:57/文章来源:https://blog.csdn.net/dingxiang234/article/details/131066916

基础篇请看:设备指纹系列–基础篇

我们接着前文继续写关于设备指纹前端接入方面的内容。话不多说,直接步入正题。

我们会在下文展示5种前端接入的方式,包括web接入、安卓接入、ios接入、微信小程序接入以及支付宝小程序接入

Web接入

第一步:引入

在页面 HTML 中引入 const-id.js,代码形如:

<script src="https://cdn.dingxiang-inc.com/ctu-group/constid-js/index.js"></script>

因js文件会定期更新,为避免js失效影响您的使用,请不要将js下载到本地服务器上引入

第二步:生成并使用

页面加载后,初始化设备指纹,需要在 JavaScript 中调用 _dx.ConstID(options, callback) 方法获取设备指纹token,代码形如:

var options = {appId: '【这里填写 AppID】', // 唯一标识,必填server: 'https://constid.dingxiang-inc.com/udid/c1', // constId 服务接口,可选userId: '【这里填写 userID】' // 用户标识,可选
};_dx.ConstID(options, function (err, token) {if (err) {// console.log('error: ' + err);return;}// console.log('const-id token is ' + token);
});

同时也支持Promise的用法

_dx.ConstID(options).then(function(token) {console.log(token)
}).catch(function(err) {console.log(err)
})

options 字段说明

字段类型是否必填说明
appIdString当前应用的标识
serverStringconstId 服务接口,可选,如不填,则默认会用云服务接口
sceneString场景标识,例如 loginsurvey
userIdString业务方的用户唯一标识,例如用户名、用户ID、手机号、Email等
timeoutnumber超时失败时间,单位为毫秒
cacheboolean默认为 true,表示会缓存采集结果;改为 false 则每次会重新采集

PC浏览器兼容

浏览器最低版本
IE8
Edge20
Chrome60
Safari11
Firefox60
36010
Sougou8
QQ4

移动端浏览器兼容

浏览器最低版本
Chrome60
UC12
QQ8
Safari11
原生安卓4.0及以上

安卓接入

一、 环境要求

条目说明
开发目标Android 4.0+
开发环境Android Studio 3.0.1 或者 Eclipse + ADT
CPU架构ARM 或者 x86
SDK三方依赖

二、 集成SDK

2.1 下载SDK

点击下载SDK

点击下载demo(仅做代码配置演示使用)

2.2 Android Studio 集成

SDK包集成内容:

  • dx-risk-vx.x.x.aar
2.2.1 把aar文件放到相应模块的libs目录下

Demo工程结构如下

.
├── app
│   ├── build.gradle
│   ├── libs
│   │   └── dx-risk-vx.x.xxr.xxxxxxxx.aar
│   ├── proguard-rules.pro
│   └── src
│       └── main
├── build.gradle
├── gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
2.2.2 在该Module的build.gradle中如下配置:
android {packagingOptions {doNotStrip "**/lib*Risk*.so"}
}dependencies {implementation fileTree(dir: 'libs', include: ['*.aar'])
}

2.3 (可选)添加SDK所需权限

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>

2.4 Proguard混淆配置

-dontskipnonpubliclibraryclassmembers
-keepattributes *Annotation*,EnclosingMethod-dontwarn com.dx.mobile.**
-dontwarn *.com.dx.mobile.**
-dontwarn *.com.mobile.strenc.**
-keep class com.dx.mobile.risk.**{*;}
-keep class com.security.inner.**{*;}
-keep class *.com.dx.mobile.**{*;}
-keep class *.com.mobile.strenc.**{*;}

2.5 API 6.0或以上动态权限申请说明

需要动态申请权限如下:

android.permission.WRITE_EXTERNAL_STORAGE
android.permission.READ_EXTERNAL_STORAGE
android.permission.READ_PHONE_STATE
android.permission.ACCESS_COARSE_LOCATION
android.permission.ACCESS_FINE_LOCATION

动态申请代码实例(Activity下):

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_demo);// API 23或以上的动态申请权限if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {String[] permissionArray = {"android.permission.ACCESS_COARSE_LOCATION","android.permission.ACCESS_FINE_LOCATION","android.permission.ACCESS_BACKGROUND_LOCATION","android.permission.WRITE_EXTERNAL_STORAGE","android.permission.READ_EXTERNAL_STORAGE","android.permission.READ_PHONE_STATE",};this.requestPermissions(permissionArray, 1);}}@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);// start getTokennew Thread(new Runnable() {@Overridepublic void run() {HashMap<String, String> params = new HashMap<String, String>();String token = DXRisk.getToken("appid", params);}}).start();}

三. 接口使用说明

3.1 方法和参数说明
功能描述

采集端的设备指纹信息,上传至风控后台,再由风控后台返回token。 该API为耗时操作,因此必须在非主线程上调用,否则会抛异常。

方法说明

DXRisk.java 该类是DxRisk SDK的风控组件接口,负责采集本地信息并返回用户前端token。

隐私采集白名单

自v6.1.18r开始,SDKsetup前,可以调用setAllowPrivacyList进行隐私采集白名单的设置,默认关闭所有涉及隐私规范红线的采集项

public static void setAllowPrivacyList(long privacyFlag)

使用示例

setAllowPrivacyList(PrivacyFlag.ANDROID_ID); //只采集ANDROID_ID
//自定义列表模式
setAllowPrivacyList(PrivacyFlag.X | PrivacyFlag.Y | ...); //表示既采集X又采集Y,X、Y表示具体某项采集的FLAG值,如下表

以下为提供的白名单采集项

FLAG描述
DEFAULT默认值,关闭所有隐私采集项
ALL打开所有隐私采集项
IMEI加入该FLAG则采集手机IMEI值,否则不采集
IMSI加入该FLAG则采集手机IMSI值,否则不采集
MEID加入该FLAG则采集手机MEID值,否则不采集
SERIAL_NUMBER加入该FLAG则采集手机SERIAL_NUMBER值,否则不采集
MAC_ADDRESS加入该FLAG则采集手机MAC_ADDRESS值,否则不采集
ICCID加入该FLAG则采集手机ICCID值,否则不采集
ANDROID_ID加入该FLAG则采集手机ANDROID_ID值,否则不采集
DEVICE_ID加入该FLAG则采集手机DEVICE_ID值,否则不采集
GET_INSTALLED_PACKAGES加入该FLAG则采集手机的应用安装列表,否则不采集
初始化setup

SDK使用前必须调用先setupsetup主要用于数据/环境初始化,一般在ApplicationonCreate下调用:

/**
* 初始化参数,环境
* @param context
* @return
*/
public static boolean setup(Context context)

PS:下列两种方式获取token在网络通畅的情况下没有任何的不同。

常规Token
/*** @return token 通常返回长度为40的字符串。在网络卡顿或不通的情况下,返回4-5k的字符串。* @throws DXRiskErrorException 如在主线程调用本API,或者appId为空等等,则会抛出该异常*/
public static String getToken(String appId, HashMap<String, String> paramsMap) throws DXRiskErrorException
精简Token

获取轻量级Token可获取的设备信息信息远少于getToken(),可能会造成在判断设备是否有风险时出现较大误差,请谨慎使用。

/**`* @return token 通常返回长度为40的字符串。在网络卡顿或不通的情况下,返回1k的字符串。`* @throws DXRiskErrorException 如在主线程调用本API,或者appId为空等等,则会抛出该异常*/
public static String getLightToken(String appId, HashMap<String, String> paramsMap) throws DXRiskErrorException

3.2 使用示例

3.2.1 初始化setup

建议Application.onCreate下调用

@Override
public void onCreate() {super.onCreate();	// 环境初始化DXRisk.setup(this);
}
3.2.2 获取token

整个过程由于是耗时操作,必须要在非主线程上执行,否则会crash

new Thread(){@Overridepublic void run() {/* 私有化配置 */HashMap<String, String> params = new HashMap<String, String>();// 这里请填写对应的服务端url,注意SAAS和私有化的区别params.put(DXRisk.KEY_URL, "https://constid.dingxiang-inc.com");// 开启线上数据备份 // params.put(DXRisk.KEY_BACKUP, DXRisk.VALUE_ENABLE_BACKUP);// 设置请求token超时时长ms,不设置默认为500msparams.put(DXRisk.KEY_DELAY_MS_TIME, "2000");//此配置关闭SDK缓存,表示每次调用接口都是强制采集信息// params.put("PRIVATE_CLEAR_TOKEN", "clear");// 开通服务后可在应用管理菜单中获取;私有化版本请填写私有化appIdString appId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";// 获取设备指纹tokenfinal String token = DXRisk.getToken(appId, params);// TODO 把token通过Post请求,传到用户后端}
}.start();

3.3 异常说明

在获取token过程中,如果因为网络超时或者加解密失败,该接口有可能会返回为null,同时会输出tag为DXRISK的错误信息,具体描述如下:

DXRISK_REQUEST_NETWORK_ERR            -1001         //网络链接失败
DXRISK_REQUEST_DECRYPT_ERR            -1002         //数据解密错误
DXRISK_REQUEST_UNCOMPRESS_ERR         -1003         //解压错误
DXRISK_REQUEST_RESPONSE_EMPTY_ERR     -1004         //返回为空
DXRISK_REQUEST_DATA_PARSE_ERR         -1005         //数据解析失败
DXRISK_REQUEST_DIRTY_DATA_ERR         -1006         //脏数据
DXRISK_CONST_ID_EMPTY                 -1007         //constid为空

ios接入

一、环境需求

条目说明
兼容平台iOS 8.0+
开发环境XCode 4.0 +
CPU架构armv7, arm64, i386, x86_64
SDK依赖libz, libresolv, libc++ , SystemConfiguration.framework , CoreLocation.framework , CoreTelephony.framework

二、集成SDK

2.1 下载SDK
  • 点击下载集成oc版本demo
  • 点击下载集成swift版本demo

点击下载指纹SDK,SDK的目录结构如下:

  • dx-risk-iOS-x.x.x-xxxxxxx目录 DXRisk sdk

    • DXRisk.framework 不带idfa获取逻辑的Dynamic Library Framework
    • DXRiskWithIDFA.framework 带idfa获取逻辑的Dynamic Library Framework
    • DXRiskStatic.framework 不带idfa获取逻辑的Static Library Framework
    • DXRiskStaticWithIDFA.framework 带idfa获取逻辑的Static Library Framework
2.2 将SDK接入XCode
2.2.1 导入Framework

DXRisk.framework,DXRiskWithIDFA.framework,DXRiskStatic.framework,DXRiskStaticWithIDFA.framework`其中之一直接拖入工程目录中,或者右击总文件夹添加文件。

  • 如果App中包含广告相关的功能,则选择DXRiskWithIDFA.framework 或者 DXRiskStaticWithIDFA.framework,该版本可以提供更精准的token
  • 如果没有广告,获取idfa可能导致拒绝上架,此时请选择DXRisk.framework 或者 DXRiskStatic.framework
2.2.2 添加FrameWork到工程

若在项目中添加DXRisk.framework或者DXRiskWithIDFA.framework其中之一,选择Target -> General,在Frameworks,Libraries,and Embedded Content中,将DXRisk.framework或者DXRiskWithIDFA.framework 对应的 Embed 切换到Embed & Sign。如下图:

若在项目中添加DXRiskStatic.framework或者DXRiskStaticWithIDFA.framework其中之一,需要在Build Settings -> Other Linker Flags 设置 -ObjC 如下图:

4A23453213E696EC12C2AE2A1070EA0C.jpg

2.2.3 配置打包脚本

以下的操作仅限导入DXRisk.framework ,DXRiskWithIDFA.framework动态库

此步骤主要是解决上传Store架构不符合的问题,如项目中已配置过Carthage或有其他相关的打包Framework调整脚本,可略过此步自行调整 选择Target -> Build Phases,点击+按钮,添加如下脚本:


APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"EXTRACTED_ARCHS=()for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
doneecho "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"done
2.2.4 权限注意

在iOS 12的环境最好在Capabilities->Access WiFi Information 进行开启操作,这样方便设备指纹数据采集。 F1B9CF2A-6E7A-491F-8DD7-8ACFAAD996D2.png

三、接口使用说明

3.1 方法和参数说明
// 风控组件:DXRiskManager类
@interface DXRiskManager : NSObject// 字符串常量
extern NSString* const DXRiskManagerKeyUserId;
extern NSString* const DXRiskManagerKeyEmail;
extern NSString* const DXRiskManagerKeyPhone;
extern NSString* const DXRiskManagerKeyUserExtend1;
extern NSString* const DXRiskManagerKeyUserExtend2;
extern NSString* const DXRiskManagerKeyURL;//私有化服务器地址
extern NSString* const DXRiskManagerKeyBackup;//私有化下使用,将数据备份到顶象服务器(开启为DXRiskManagerKeyBackupEnable 值)
extern NSString* const DXRiskManagerKeyBackupAppId; // 私有化下使用,指定数据备份到顶象服务器的AppId extern NSString* const DXRiskManagerKeyDegradeNotify;//数据降级通知,若打开,服务端会有响应的降级统计
extern NSString* const DXRiskManagerKeyCountry;//国家地区设置,默认中国extern NSString* const DXRiskManagerKeyDelayMsTime; //可填设置请求超时毫秒时间(默认值为 500 ,范围是:【100 : 3000】)
// NoticeDegrade参数
/* The NoticeDegrade Value. This value only be used pair with key:DXRiskManagerKeyDegradeNotify to notify token degrade. */
extern NSString* const DXRiskManagerKeyDegradeNotifyEnable;
// Backup参数
/* The Backup Value. This value only be used pair with key:DXRiskManagerKeyBackup to set data backup. */
extern NSString* const DXRiskManagerKeyBackupEnable;
// Country参数
/* The Country Value. This value only be used pair with key:DXRiskManagerKeyCountry to set country. */
extern NSString* const DXRiskManagerCountryChina;
/* The Country Value. This value only be used pair with key:DXRiskManagerKeyCountry to set country. */
extern NSString* const DXRiskManagerCountryIndonesia;/**采集端的设备指纹信息,上传至风控后台,再由风控后台返回token。该API为耗时操作,因此必须在非主线程上调用。@param appId appId   开通服务后可在二级菜单“应用管理”中获取@param extendsParams 配置项@return token*/
+ (NSString *)getToken:(NSString *)appId extendParams:(NSDictionary *)extendsParams;/** DXRiskManager -- 初始化方法*/
+ (BOOL)setup;  
@end
3.2 使用示例
// 整个过程由于是耗时操作,必须要在非主线程上执行,否则会阻塞UI。如果本身已经在非UI线程上执行,则不需要另开线程dispatch_queue_t dxrisk_queue = dispatch_queue_create("com.dingxiang.dxrisk", DISPATCH_QUEUE_CONCURRENT);dispatch_async(dxrisk_queue, ^{NSMutableDictionary *dic = [NSMutableDictionary dictionary];// 根据业务逻辑,填充自定义字段[dic setObject:@"123456" forKey:DXRiskManagerKeyUserId];// 如需设置海外服务器, 可选值请参考头文件字段[dic setObject:DXRiskManagerServiceAreaSoutheastAsia forKey:DXRiskManagerKeyServiceArea];// 如需自定义服务端URL,填充DXRiskManagerKeyURL字段(私有化部署的情况)// 如有需要则添加DXRiskManagerKeyBackup参数,Value固定为DXRiskManagerKeyBackupEnable// DXRiskManagerKeyBackupAppId参数可不填,参数为顶象备份数据库提供的备份Appid[dic setObject:@"http://xxxxxxx" forKey:DXRiskManagerKeyURL];// [dic setObject:DXRiskManagerKeyBackupEnable forKey:DXRiskManagerKeyBackup];[dic setObject:@"xxxxxxxxxxxxxxxxxxxx" forKey:DXRiskManagerKeyBackupAppId];// 此配置关闭SDK缓存,表示每次调用接口都强制采集信息// [dic setObject:@"clear" forKey:@"PRIVATE_CLEAR_TOKEN"];// 获取token// 注意:token最好不要保存在某个局部变量或者字段,每次使用时,都通过API获取。BOOL isSuccess = [DXRiskManager setup];NSLog(@"setup success: %@" , isSuccess ? @"YES":@"NO");NSString *constID = [DXRiskManager getToken:@"xxxxxxxxxxxxxxxxxxxx" extendsParams:dic];NSLog(@"constID: %@", constID);// TODO 把constid通过Post请求,传到业务后台。// 下面是模拟频繁调用的过程while(TRUE) {NSLog(@"constID: %@", [DXRiskManager getToken:@"xxxxxxxxxxxxxxxxxxxx" extendsParams:dic]);[NSThread sleepForTimeInterval:.5];}});
3.3 异常说明

在获取token过程中,如果因为网络超时或者加解密失败,该接口有可能会返回为null,同时会输出tag为DXRISK的错误信息,具体描述如下:

DXRISK_REQUEST_NETWORK_ERR            -1001         //网络链接失败
DXRISK_REQUEST_DECRYPT_ERR            -1002         //数据解密错误
DXRISK_REQUEST_UNCOMPRESS_ERR         -1003         //解压错误
DXRISK_REQUEST_RESPONSE_EMPTY_ERR     -1004         //返回为空
DXRISK_REQUEST_DATA_PARSE_ERR         -1005         //数据解析失败
DXRISK_REQUEST_DIRTY_DATA_ERR         -1006         //脏数据
DXRISK_CONST_ID_EMPTY                 -1007         //constid为空

### 微信小程序接入

js接入

一、下载设备指纹js

SaaS版本下载

私有化版本下载

请注意选择对应的版本,下载完成后放到本地项目中。

二、获取密钥

未注册用户可在顶象官网进行账号注册,创建应用获取应用密钥AppID和AppSecret。

三、使用

  1. 代码接入
const ConstId = require('本地设备指纹js存放路径')
Page({onLoad: function () {new ConstId({appId: '【这里填写在顶象官网申请到的 AppID】', // 唯一标识,必填server: 'https://host/udid/w1' // 服务接口地址,请注意私有化客户填写自有域名}, (e, id) => {if (e) {console.log(e)return}console.log('constId:', id)})}
})
  1. SaaS用户在小程序后台配置业务域名https://constid.dingxiang-inc.com,私有化用户配置本地部署域名,测试阶段可以开启微信开发者工具右上角详情->本地设置->“不校验域名”。

支付宝小程序接入

接入方式和微信小程序类似,但是使用的SDK不一样。如有需要,请联系客服获取。

const ConstId = require('本地设备指纹js存放路径')
Page({onLoad: function () {new ConstId({appId: '【这里填写在顶象官网申请到的 AppID】', // 唯一标识,必填server: 'https://host/udid/w1' // 服务接口地址,请注意私有化客户填写自有域名}, (e, id) => {if (e) {console.log(e)return}console.log('constId:', id)})}
})

以上。

如果有设备指纹需求的话,可以前往顶象:免费试用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_312474.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VSCode+GDB+Qemu调试ARM64 linux内核

俗话说&#xff0c;工欲善其事 必先利其器。linux kernel是一个非常复杂的系统&#xff0c;初学者会很难入门。 如果有一个方便的调试环境&#xff0c;学习效率至少能有5-10倍的提升。 为了学习linux内核&#xff0c;通常有这两个需要 可以摆脱硬件&#xff0c;方便的编译和…

Java基础学习+面向对象

一&#xff0c;基础概念介绍 1.1Java跨平台原理&#xff08;一次编译&#xff0c;处处运行&#xff09; Java 源代码经过编译&#xff0c;生成字节码文件&#xff0c;交由 Java 虚拟机来执行&#xff0c;不同得系统有不同得JVM,借助JVM 实现跨平台。就比如说我们在 Windows 下…

【Linux】13. 文件操作

1. 重新认识文件 经过之前的linux命令操作、进程相关概念的学习&#xff0c;我们对于文件也并不陌生 首先需要明确以下概念&#xff1a; 即使是空文件&#xff0c;也要在磁盘当中占据空间文件 文件内容 文件属性文件操作 对文件内容的操作 或者 对文件属性的操作 或者 二者…

ChatGPT训练一次要耗多少电?

如果开个玩笑&#xff1a;问ChatGPT最大的贡献是什么&#xff1f; “我觉得它对全球变暖是有一定贡献的。”知名自然语言处理专家、计算机科学家吴军在4月接受某媒体采访时如是说。 随着ChatGPT引爆AIGC&#xff0c;国内外巨头纷纷推出自己的AI大模型&#xff0c;大家为人工智…

跨境电商独立站搭建-跨境电商源码网站开发部署,独立站技术

跨境电商独立站是指在国际互联网上建立并拥有自己独立的电商网站&#xff0c;在该网站上进行跨境电商业务&#xff0c;包括产品展示、交易处理、支付结算、物流配送等全流程。相较于在第三方平台上开店&#xff0c;跨境电商独立站具有更高的自主权和品牌形象&#xff0c;能够更…

Redis 高级数据结构 HyperLogLog

介绍 HyperLogLog(Hyper[ˈhaɪpə(r)])并不是一种新的数据结构(实际类型为字符串类型)&#xff0c;而是一种基数算法,通过HyperLogLog可以 利用极小的内存空间完成独立总数的统计&#xff0c;数据集可以是IP、Email、ID等。如果你负责开发维护一个大型的网站&#xff0c;有一天…

Java实现Mqtt收发消息

Java实现Mqtt收发消息 文章目录 Java实现Mqtt收发消息windows mqtt 平台服务搭建mqtt 客户端工具&#xff1a;mqttbox整体代码结构mqtt基础参数配置类mqtt客户端连接mqtt接收的消息处理类对应的MqttService注解和MqttTopic注解 MqttGateway 发送消息指定topic接收处理方法 java…

Servlet Cookie基本概念和使用方法

目录 Cookie 介绍 Cookie 主要有两种类型&#xff1a;会话 Cookie 和持久 Cookie。 Cookie使用步骤 使用Servlet和Cookie实现客户端存储的登录功能示例&#xff1a; LoginServlet类 index.jsp 删除Cookie 浏览器中查看Cookie的方法 Cookie 介绍 Cookie 是一种在网站和…

测试老鸟总结,自动化测试难点挑战应对方法,我的进阶之路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…

不定积分练习

不定积分练习 在看视频的时候遇到了一道比较有趣的题&#xff0c;在这里给大家分享一下。 题目 计算 ∫ ( 1 x − 1 x ) e x 1 x d x \int(1x-\dfrac 1x)e^{x\frac 1x}dx ∫(1x−x1​)exx1​dx 解&#xff1a; \qquad 原式 ∫ e x 1 x d x ∫ x ( 1 − 1 x 2 ) e x 1…

Promise-用法

目录 1.处理异步的几种方案 2.理解 3.promise状态&#xff1a;初始化 4.执行异步任务 5.执行异步任务成功 6.执行异步任务失败 7.执行异步任务成功-返回 8.执行异步任务失败-返回 1.处理异步的几种方案 纯粹callback&#xff0c;会剥夺函数return的能力promise&#xf…

【Java基础学习打卡01】计算机概述

目录 引言一、计算机是什么&#xff1f;1.计算机vs计算器2.计算机定义 二、计算机发展简史三、计算机分类四、计算机基本工作原理1.冯诺依曼2.冯诺依曼原理 总结 引言 其实我们在学习Java编程之前应该要对计算机有所了解&#xff0c;这里的了解不是说我们日常接触电脑就算是了…

postgres篇---docker安装postgres,python连接postgres数据库

postgres篇---docker安装postgres&#xff0c;python连接postgres数据库 一、docker安装postgres1.1 安装Docker&#xff1a;1.2 从Docker Hub获取PostgreSQL镜像1.3 创建PostgreSQL容器1.4 访问PostgreSQL 二. python连接postgres数据库2.1 connect连接2.2 cursor2.3 excute执…

docker-compose 搭建 zipkin 服务端

目录 基于docker-compose搭建服务端 数据库 服务器 docker-compose.yaml 问题 测试 基于docker-compose搭建服务端 数据库 我这边存储选择了Mysql存储&#xff0c;新建了 zipkin库&#xff0c;数据库脚本如下 -- -- Copyright 2015-2019 The OpenZipkin Authors -- -- Li…

Springboot3 + SpringSecurity + JWT + OpenApi3 实现认证授权

Springboot3 SpringSecurity JWT OpenApi3 实现双token 目前全网最新的 Spring Security JWT 实现双 Token 的案例&#xff01;收藏就对了&#xff0c;欢迎各位看友学习参考。此项目由作者个人创作&#xff0c;可以供大家学习和项目实战使用&#xff0c;创作不易&#xff…

linux 部署mysql

本文介绍下Centos7中mysql的安装(Centos7以下版本中有些命令和centos7中有些不同&#xff0c;安时需注意下自己的linux版本) 事先准备 1、查看系统中是否自带安装mysql yum list installed | grep mysql ![在这里插入图片描述](https://img-blog.csdnimg.cn/e322b2f4036c4d9…

电力能耗监测系统是如何运作的

电力能耗监测系统数据的采集主要通过多功能仪表、通讯管理机、通讯协议实现能耗数据的采集&#xff0c;能耗数据上传后经大数据计算实现能耗数据的展示&#xff0c;满足用户对能耗监测的需求。下面对电力能耗监测系统的是怎么采集数据的展开介绍&#xff1a; 1.多功能仪表 对高…

中国的互联网技术有多厉害?

1 很多人没有意识到&#xff0c;中国的互联网技术是相当厉害的。 给大家举几个例子。 我和朋友聊天的时候&#xff0c;手机上的app都在“侧耳倾听”&#xff0c;聊天的一些关键字很快就会出现在手机浏览器的搜索栏中。 携程会给我自动推荐景点&#xff0c;美团会给我推荐美食&…

【FLoyd算法(Floyd到底做什么用 进来看看)】牛的旅行【进来学习做一道题的步骤-1.读题根据样例 概括出题意-2.分析算法-3.优化算法】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

混合动力汽车耐久测试

一 背景 整车厂可通过发动机和电机驱动的结合为多款车型提供混合动力驱动技术。汽车集成电机驱动可大大减少二氧化碳的排放&#xff0c;不仅如此&#xff0c;全电动驱动或混合动力驱动的汽车还将使用户体验到更好的驾驶感受&#xff0c;且这种汽车可通过电动机来实现更快的加速…