面包屑思维模型实战模型错题集结构手册流程手册自我检测专题模块
-
微信小程序前端微信小程序前端易错点收集查看
-
css/less/sass样式控制在开发过程中的一些样式控制bug规避查看
-
tp5开发小程序tp5开发小程序时错误积累查看
-
PHP错题集PHP在实际开发过程中遇到的问题查看
-
MySql数据库使用MySql在实际开发中遇到的错误总结查看
-
TP5错题集积累tp5框架在实际开发过程中遇到的问题查看
-
uni-app爬坑主要用于uni-app项目中遇到的一些问题查看
-
Vue.js易错收集vue.js项目常见错误收集整理查看
-
uni-app开发微信小程序uni-app开发微信小程序的一些爬坑积累查看
-
LinuxLinux在部署、开发、运维时遇见的错误积累查看
-
安全设计常见安全设计查看
-
Redis项目中使用redis的相关错误积累查看
-
前端特效前端特效相关错题集查看
最新博文
-
管理 SSH 密钥
CVM操作场景
密码是每台云服务器实例专有的登录凭据。为保证实例的安全可靠,腾讯云提供以下两种加密登录方式:
- 密码登录
- SSH 密钥对登录。
本文档介绍 SSH 密钥对登录实例相关的常见操内容。
操作步骤
创建 SSH 密钥
- 登录 云服务器控制台。
- 在左侧导航栏中,单击【SSH 密钥】。
- 在 SSH 密钥管理页面,单击【创建密钥】。
- 在弹出的创建 SSH 密钥窗口中,选择密钥的创建方式,填写相关信息,并单击【确定】。
- 若创建方式选择 “创建新密钥对”,请输入密钥名称。
- 若创建方式选择 “使用已有公钥”,请输入密钥名称和原有的公钥信息。
- 在弹出的提示框中,单击【下载】,即可下载私钥。注意:
腾讯云不会保管您的私钥信息,请在10分钟内下载和获取私钥。
密钥绑定/解绑云服务器
- 登录 云服务器控制台。
- 在左侧导航栏中,单击【SSH 密钥】。
- 在 SSH 密钥管理页面,勾选需要绑定/解绑云服务器的 SSH 密钥,单击【绑定/解绑实例】。
- 在弹出的绑定/解绑实例窗口中,选择地域,绑定/解绑云服务器,单击【确定】。
修改 SSH 密钥名称/描述
删除 SSH 密钥
注意:若 SSH 密钥已关联云服务器或已关联自定义镜像,则该密钥不能删除。
使用 SSH 密钥登录 Linux 云服务器
阅读更多风口下的猪2020-04-24【CVM】
-
telnet,ssh1和ssh2的区别
LinuxTelnet SSH是常用的远程管理协议,都是TCP协议,建立会话先要进行TCP三次握手,有确认机制所以是可靠的传输协议,端口号分别是23和22。
Telnet采用明文传输,传输过程容易被窃取,除管理以外 还可用于端口扫描、测试目标端口可达、是否开放。
SSH 简单来说采用SSL加密传输,创建会话会产生一个非对称秘钥对(RSA、DSA、DH算法),服务端拥有私钥,客户端会提示接收/保存公钥,公钥加密的数据只有私钥才能解密。
然后再协商交换一个对称秘钥来加密之间的数据(DES、3DES、AES处理速度快),这样就可以防止信息泄露。
SSH不仅可以用来远程管理,还可以扩展SFTP、SCP、SLogin等等。
至于SSHv1和SSHv2(也有叫v1.5和 v1.9),前者稍有缺陷,v2进行算法修复。
阅读更多风口下的猪2020-04-24【Linux】
-
个推(4)消息体与推送执行
消息推送推送实现的逻辑是:
(1)先通过sdk实例一个推送对象;
$igt = new \IGeTui($this->host,$this->appkey,$this->mastersecret);(2)再给推送对象载入消息体;
(3)执行推送接口
一.消息体
消息体主要由三部分组成:消息模板、消息属性、接收方
1.消息模板
模板类型
消息模板依据功能类型分为:
# 穿透消息模板 (IGtTransmissionTemplate)
# 通知栏消息模板,点击进入应用 (IGtNotificationTemplate)
# 通知栏消息模板,点击跳转url (IGtLinkTemplate)
eg:
$template = new \IGtNotificationTemplate();通用模板参数
(1)appkey和appid等信息
$template->set_appId(APPID);//应用appid
$template->set_appkey(APPKEY);//应用appkey(2)透传消息类型
$template->set_transmissionType(1);//透传消息类型
(3)透传内容
$template->set_transmissionContent("测试离线");//透传内容
(4)通知栏标题
$template->set_title("请输入通知栏标题");//通知栏标题
(5)通知栏内容
$template->set_text("请输入通知栏内容");//通知栏内容
(6)通知栏logo
$template->set_logo("http://wwww.igetui.com/logo.png");//通知栏logo
(7)是否响铃
$template->set_isRing(true);//是否响铃
(8)是否震动
$template->set_isVibrate(true);//是否震动
(9)通知栏是否可清除
$template->set_isClearable(true);//通知栏是否可清除
2.消息属性
消息属性根据发送的消息类型不同而不同
eg:
$message = new \IGtSingleMessage();(1)是否离线
$message->set_isOffline(true);
(2)离线时间
$message->set_offlineExpireTime(60 * 60 * 1000);
(3)载入推送模板
$message->set_data($template);
3.接收方
接收方根据推送类型的不同,也不同
eg:
$target = new \IGtTarget();(1)与个推服务器建立连接的app的唯一标识appid
$target->set_appId($this->appid);
(2)单推(发)的目标clientid
$target->set_clientId($cid);
总结:消息体捏成,依据推送的类型,消息体的消息模板、消息属性、接收方都要保持一致。
二.推送接口(执行推送)
个推为开发者提供了如下3种消息推送方式:
- (1)toSingle :简称“单推”,指向单个用户推送消息
- $rep = $igt->pushMessageToSingle($message, $target,$requstId);
- (2)toList:简称“批量推”,指向制定的一批用户推送消息
- (3)toApp:简称“群推”,指向APP符合筛选条件的所有用户推送消息,支持定速推送、定时推送,支持条件的交并补功能
$rep = $igt->pushMessageToApp($message);//执行推送总结:依据不同的推送类型
(1)消息体内部各要素要一致;
(2)消息体与推送接口(执行推送)要一致
阅读更多风口下的猪2020-04-24【消息推送】
-
个推(3)单发
消息推送个推单发,需要app在手机中的clientid。
项目中实现单发,必须要在用户注册时,前端获取clientid传给后端,后端将其作为用户子段信息存入数据库。
let clientInfo=plus.push.getClientInfo();
this.clientid=clientInfo.clientid;需要注意的是clientid的失效处理,其在以下情况会失效,需要重新获取存入:
(1)用户超过三个月未登录,之后再登录会重新生成一个cid;
(2)卸载应用,且再次调用个推初始化时无外部存储读写权限。
阅读更多风口下的猪2020-04-23【消息推送】
-
个推(2)服务器端集成
消息推送本篇主要是服务器端php版本个推SDK的集成。
主要步骤是
(1)下载SDK并置于项目中;
(2)配置AppId、AppKey、AppSecret、masterSecret;
(3)封装一个个推类供其它层调用(可以这么理解,其实服务器端SDK集成工作,就是封装这个类)
一.下载SDK并置于项目中
下载地址:http://www.getui.com/download/docs/getui/server/GETUI_PHP_SDK_4.1.2.0.zip
服务器端使用的是tp系列,则将SDK压缩包解压,放到extend目录下。
二.配置AppId、AppKey、AppSecret、masterSecret;
封装类中不宜直接出现AppId、AppKey、AppSecret、masterSecret等敏感信息,所以要将这些数据放到配置文件当中。tp扩展配置目录extra中新建配置文件getui.php
<?phpreturn [// +---------------------------------// 个推相关配置// +---------------------------------//AppID:由IGetui管理页面生成,是您的应用与SDK通信的标识之一,每个应用都对应一个唯一的AppID。'appid' => 'xxx',//AppSecret:第三方客户端个推集成鉴权码,用于验证第三方合法性。在客户端集成SDK时需要提供。'AppSecret' => 'xxx',//AppKey:预先分配的第三方应用对应的Key,是您的应用与SDK通信的标识之一。'appkey' => 'xxx',//MasterSecret:个推服务端API鉴权码,用于验证调用方合法性。在调用个推服务端API时需要提供。(请妥善保管,避免通道被盗用)。'mastersecret' => "xxx",//'host' => "http://sdk.open.api.igexin.com/apiex.htm",];三.封装个推业务类
在extend个推文件目录中,与demo.php同级建立一个GeTui类
<?phpnamespace getuiclass GeTui{private $host = 'http://sdk.open.api.igexin.com/apiex.htm';//测试private $appkey = '';private $appid = '';private $mastersecret = '';private function init(){// header("Content-Type: text/html; charset=utf-8");$this->appid = config('getui.appid');$this->appkey = config('getui.appkey');$this->mastersecret = config('getui.mastersecret');$this->host = config('getui.host');}public function __construct(){$this->init();$this->__loader();}private function __loader(){require_once(dirname(__FILE__) . '/' . 'IGt.Push.php');require_once(dirname(__FILE__) . '/' . 'igetui/IGt.AppMessage.php');require_once(dirname(__FILE__) . '/' . 'igetui/IGt.TagMessage.php');require_once(dirname(__FILE__) . '/' . 'igetui/IGt.APNPayload.php');require_once(dirname(__FILE__) . '/' . 'igetui/template/IGt.BaseTemplate.php');require_once(dirname(__FILE__) . '/' . 'IGt.Batch.php');require_once(dirname(__FILE__) . '/' . 'igetui/utils/AppConditions.php');require_once(dirname(__FILE__) . '/' . 'igetui/template/notify/IGt.Notify.php');require_once(dirname(__FILE__) . '/' . 'igetui/IGt.MultiMedia.php');require_once(dirname(__FILE__) . '/' . 'payload/VOIPPayload.php');}//服务端推送接口,支持三个接口推送//1.PushMessageToSingle接口:支持对单个用户进行推送//2.PushMessageToList接口:支持对多个用户进行推送,建议为50个用户//3.pushMessageToApp接口:对单个应用下的所有用户进行推送,可根据省份,标签,机型过滤推送//单推接口案例function pushMessageToSingle($cid){$igt = new \IGeTui($this->host,$this->appkey,$this->mastersecret);//消息模版:// 通知栏消息模板$template = $this->IGtNotificationTemplateDemo();// 穿透消息模板// $template = $this->IGtTransmissionTemplateDemo();//定义"SingleMessage"$message = new \IGtSingleMessage();$message->set_isOffline(true);//是否离线$message->set_offlineExpireTime(3600*12*1000);//离线时间$message->set_data($template);//设置推送消息类型//$message->set_PushNetWorkType(0);//设置是否根据WIFI推送消息,2为4G/3G/2G,1为wifi推送,0为不限制推送//接收方$target = new \IGtTarget();$target->set_appId($this->appid);$target->set_clientId($cid);// $target->set_alias(Alias);try {$rep = $igt->pushMessageToSingle($message, $target);var_dump($rep);echo ("<br><br>");}catch(RequestException $e){$requstId =e.getRequestId();//失败时重发$rep = $igt->pushMessageToSingle($message, $target,$requstId);var_dump($rep);echo ("<br><br>");}}//穿透消息模板public function IGtTransmissionTemplateDemo(){$template = new \IGtTransmissionTemplate();$template->set_appId($this->appid); //应用appid$template->set_appkey($this->appkey); //应用appkey//透传消息类型$template->set_transmissionType(2);$payload = ['title' => '测试','content' => '1111','payload' => '测试参数'];//透传内容$template->set_transmissionContent(json_encode($payload));// $template->set_duration(BEGINTIME,ENDTIME); //设置ANDROID客户端在此时间区间内展示消息//这是老方法,新方法参见iOS模板说明(PHP)*///$template->set_pushInfo("actionLocKey","badge","message",//"sound","payload","locKey","locArgs","launchImage");// APN高级推送// $apn = new \IGtAPNPayload();// $alertmsg=new \DictionaryAlertMsg();// $alertmsg->body="body";// $alertmsg->actionLocKey="ActionLockey";// $alertmsg->locKey="LocKey";// $alertmsg->locArgs=array("locargs");// $alertmsg->launchImage="launchimage";return $template;}//通知栏消息 (通知栏显示 点击启动应用)function IGtNotificationTemplateDemo(){$template = new \IGtNotificationTemplate();$template->set_appId($this->appid); //应用appid$template->set_appkey($this->appkey); //应用appkey$template->set_transmissionType(1);//透传消息类型$template->set_transmissionContent("测试离线");//透传内容$template->set_title("订单提醒");//通知栏标题$template->set_text("你有新的订单,请查看");//通知栏内容$template->set_logo("http://www.igetui.com/logo.png");//通知栏logo$template->set_isRing(true);//是否响铃$template->set_isVibrate(true);//是否震动$template->set_isClearable(true);//通知栏是否可清除//$template->set_duration(BEGINTIME,ENDTIME); //设置ANDROID客户端在此时间区间内展示消息return $template;}//群推接口案例public function pushMessageToApp(){$igt = new \IGeTui($this->host,$this->appkey,$this->mastersecret);$template = $this->IGtNotificationTemplateDemo();//个推信息体//基于应用消息体$message = new \IGtAppMessage();$message->set_isOffline(true);$message->set_offlineExpireTime(10 * 60 * 1000);//离线时间单位为毫秒,例,两个小时离线为3600*1000*2$message->set_data($template);$appIdList=array($this->appid);$phoneTypeList=array('ANDROID');$provinceList=array('上海');$tagList=array('中文');$age = array("0000", "0010");$message->set_appIdList($appIdList);$rep = $igt->pushMessageToApp($message);//执行推送var_dump($rep);echo ("<br><br>");}//通知栏显示 点击跳转urlfunction IGtLinkTemplateDemo(){$template = new \IGtLinkTemplate();$template ->set_appId($this->appid);//应用appid$template ->set_appkey($this->appkey);//应用appkey$template ->set_title("测试群发消息");//通知栏标题$template ->set_text("点击就送66个老铁666");//通知栏内容$template ->set_logo("http://www.igetui.com/logo.png");//通知栏logo$template ->set_isRing(true);//是否响铃$template ->set_isVibrate(true);//是否震动$template ->set_isClearable(true);//通知栏是否可清除$template ->set_url("http://www.igetui.com/");//打开连接地址//$template->set_duration(BEGINTIME,ENDTIME); //设置ANDROID客户端在此时间区间内展示消息return $template;}}四.调用
例如在项目中test.php
public function getuiTest(){//实例化之前写的类$getui = new \getui\GeTui();//单发测试 $cid 客户端id 前端获取// $getui->pushMessageToSingle($cid);// 群发测试$getui->pushMessageToApp();// dump($getui);die;}public function getuiToSingle(){$getui = new \getui\GeTui();$cid='xxxx';// 单发测试 $cid 客户端id 前端获取$getui->pushMessageToSingle($cid);}
阅读更多风口下的猪2020-04-23【消息推送】
-
APNs通知和应用内通知
消息推送APNs推送
APNs推送通知是通过GGSN代理来处理接收方节点与外部网络的通讯来实现消息传递,
数据传递线路是:服务器端发送数据-->到推送业务商服务器(个推/极光等)--->到APNs服务器--->接收方节点。
特点是:
(1)离线消息由APNs服务器缓存;
(2)推出应用/后台运行/退出后台等情况,都能接收到消息;
应用内推送
应用内推送分为通知和透传
数据传递线路是:服务器端发送数据-->到推送业务商服务器(个推/极光等)--->接收方节点。
特点是:
(1)离线消息由推送业务商服务器缓存,且有一定缓存条数限制;
(2)接收信息需要应用在进程中与推送业务商服务器处于连接状态。
阅读更多风口下的猪2020-04-23【消息推送】
-
什么是APN
消息推送APN(Access Point Name)指一种网络接入技术,是通过手机上网时必须配置的一个参数,它决定了手机通过哪种接入方式来访问网络。
对于手机用户来说,可以访问的外部网络类型有很多,例如:Internet、WAP网站、集团企业内部网络、行业内部专用网络。而不同的接入点所能访问的范围以及接入的方式是不同的,网络侧如何知道手机激活以后要访问哪个网络从而分配哪个网段的IP呢,这就要靠APN来区分了,即APN决定了用户的手机通过哪种接入方式来访问什么样的网络。
一.基本含义
APN决定了手机通过哪种接入方式来访问网络,用来标识GPRS的业务种类。
APN分为两大类:WAP业务、WAP以外的服务,比如:连接因特网。
从运营商角度看,APN就是一个逻辑名字,APN一般都部署在GGSN(Gateway GPRS Support Node,网关GPRS支持节点)设备上或者逻辑连接到GGSN上,用户使用GPRS上网时,都通过GGSN代理出去到外部网络,因此,APN设置、过滤、统计等,就成为一个对GPRS计费、GPRS资费有重要参考价值的参数之一(因为APN可以区分一个业务或者外部网络)。
APN的完整说明在3GPP规范TS23.003 Clause 9中进行了详细定义。
二.APN的构成
APN在GPRS骨干网中用来标识要使用的外部PDN(Packet data network,分组数据网,即常说的Internet),在GPRS网络中代表外部数据网络的总称。APN由以下两部分组成:
(1)APN网络标识:是用户通过GGSN/PGW(Gateway GPRS Support Node,GPRS网关支持节点/PDN Gateway ,分组数据网网关)可连接到外部网络的标识,该标识由网络运营者分配给ISP(Internet Service Provider,因特网业务提供者)或公司,与其固定Internet域名一致,是APN的必选组成部分。例如 , 定义移动用户通过该接入某公司的企业网,则APN的网络标识可以规划为“www.ABC123.com”。
(2)APN运营者标识:用于标识GGSN/PGW所归属的网络,是APN的可选组成部分。其形式为“MNCxxxx.MCCyyyy.gprs”(3G网络中),或者“MNCxxxx.MCCyyyy.3gppnetwork.org(4G网络中)。
APN实际上就是对一个外部PDN的标识,这些PDN包括企业内部网、Internet、WAP网站、行业内部网等专用网络。网络侧如何知道手机到底做了激活以后要访问哪个网络呢(因为每个网络分配的IP可能都是不一样的,有的是私网,有的是公网IP),这就要靠APN来区分了,当然各个运营商可能名字不一样。
三.APN类型
现在涉及到的APN有以下两种:通过手机浏览器上网时使用、通过客户端软件来登陆服务器时使用。现在国内销售的手机都已经将APN配置预先做好了。
四.专线APN
专线APN根据企业对网络安全的特殊要求,采用了多种安全措施,主要包括:
(1) 通过一条2M 专线接入运营商GPRS网络,双方互联路由器之间采用私有IP地址进行广域连接,在GGSN与移动公司互联路由器之间采用GRE隧道。
(2) 为客户分配专用的APN,普通用户不得申请该APN。用于GPRS专网的SIM卡仅开通该专用APN,限制使用其他APN。
(3) 客户可自建一套RADIUS服务器和DHCP服务器,GGSN向RADIUS服务器提供用户主叫号码,采用主叫号码和用户账号相结合的认证方式;用户通过认证后由DHCP服务器分配企业内部的静态IP地址。
(4) 端到端加密:移动终端和服务器平台之间采用端到端加密,避免信息在整个传输过程中可能的泄漏。
(5) 双方采用防火墙进行隔离,并在防火墙上进行IP地址和端口过滤。
五.业务流程
APN通常作为用户签约数据存储在HSS (Home Subscriber Server,归属用户服务器)/HLR(以下简称HLR)中,用户手机在发起分组业务时也可向网络侧SGSN(Serving GPRS Support Node,服务GPRS支持节点)/MME(Mobility Management Entity,移动管理实体)提供APN。SGSN/MME(以下简称SGSN)根据用户所提供的APN,通过DNS(Domain Name Server,域名服务器)进行域名解析,从而获取到GGSN/PGW(以下简称GGSN)的IP地址,将用户接入到APN对应的PDN中。此外,HLR中也可存储一个通配符,这样用户或SGSN就可以选择接入一个没有在HLR中存储的APN。
SGSN存储APN与GGSN地址对应表,通过不同的APN选择不同的GGSN。APN的获取方式如下:
(1)用户提供
(2)用户定制
(3)SGSN指定
用户可以激活多个PDP上下文,每个PDP上下文与一个APN相联系。用户选择不同的APN的目的就是通过不同的GGSN选择外部网络。
APN需要通过DNS进行域名解析才能获取GGSN或外部网络节点的真实的IP地址。
GPRS专网系统终端上网登录服务器平台的流程为:
1)用户发出GPRS登录请求,请求中包括由运营商为GPRS专网系统专门分配的专网APN;
2)根据请求中的APN,SGSN向DNS服务器发出查询请求,找到与企业服务器平台连接的GGSN,并将用户请求通过GTP隧道封装送给GGSN;
3)GGSN将用户认证信息(包括手机号码、用户账号、密码等)通过专线送至Radius进行认证;
4)Radius认证服务器看到手机号等认证信息,确认是合法用户发来的请求,向DHCP服务器请求分配用户地址;
5)Radius认证通过后,由Radius向GGSN发送携带用户地址的确认信息;
6)用户得到了IP地址,就可以携带数据包,对GPRS专网系统信息查询和业务处理平台进行访问。
阅读更多风口下的猪2020-04-23【消息推送】
-
个推(1)消息通知和透传
消息推送一.消息透传
透传,即透明传输,只负责将需要传输的数据送达到目标节点,不管具体的传输业务如何,也不对传输业务进行任何处理。
属性:
(1)透传的数据就是消息体格式和内容;
(2)传递通道对传递业务不过问,不进行任何处理;
(3)客户端接收到数据后,由客户端自己处理数据;
(4)传递数据为json格式。
正是因为透传消息可以自定义消息体,也可以自定义消息的展示方式及后续动作处理,所以弥补了通知栏消息的一些不足之处(通知栏消息是直接展示出来,相关的动作客户端无法捕获到)。
特征:
(1)后台处理,用户无感知;
(2)前台展示,提醒用户;
(3)展示多样化。
透传流程:
1.服务器捏出透传数据(包含消息模板、消息属性、接收方),通过个推开放的API向个推服务器发送透传数据;
2.个推服务器接收透传数据,不做任何业务处理,直接将信息发送给接收方节点;
3.当接收方客户端SDK接收到透传消息后,以广播的形式发送给客户端;
4.客户端在配置的第三方BroadReceiver里接收到透传消息后进行处理。
应用:
(1)用户无感知的透传,如:更新相关信息,在主界面中相关栏位用红点标识进行弱提醒,推送一条命令用来检测用户是否有登录等。通知栏消息虽然方便的提醒用户,但也在一定程度上给用户带来了打扰,用户无感知的消息推送有时效果会更好。
(2)用户有感知的透传:把透传消息处理成通知栏展示出来,提醒用户方便点击查看相关信息(如个人帐单信息),直接打开应用或跳转到指定的应用界面中(根据透传消息的相关参数来判断跳转到哪一个指定的界面,相关参数传递要打开的界面的类名或Intent即可)等。对于开发者,处理成通知栏的相关事件也是可以捕获的,如通知栏的展示、点击等事件都可以进行捕获,以方便进行后续的操作。
因透传消息可以自己处理成通知栏内容展示,所以通知栏的样式也可以根据需求来做对应的改变。在Android 4.4及以上的系统,通知栏可以是样式丰富的通知栏,放入图片和视频等;可以展示普通的通知,也可以展示多样化的通知。
阅读更多风口下的猪2020-04-23【消息推送】
-
ajax返回200成功,却进入error函数的解决方法
JavaScript最近碰到一个问题,就是如题目所说,ajax在调用的时候,明明返回成功了,但js代码却走到了error中,最后发现是我返回的json格式不对,jQuery在1.4后,对ajax返回的json格式有了很强的限制,所以一定要用严格的JSON格式返回.
阅读更多风口下的猪2020-04-01【JavaScript】
-
vue中 props中的变量不能在less中使用
vue那是在编译前, 怎么玩都行, 编译之后到浏览器运行了, 那就是纯css了, 很显然,目前来说在运行时给css传递参数是不能的
阅读更多风口下的猪2020-03-09【vue】
-
better-scroll在项目中涉及到v-if控制显示切换时,滑动失效
uni-app
阅读更多风口下的猪2020-03-07【uni-app】