关于HttpUrlConnection请求网络加载证书与不加载证书的区别

测试的3个网址分别为: String uri1 = “https://mportal.tianjihuifu.com/tjhf/loginRegist/login?uname=13265468238&pwd=123456”; String uri2 = “https://mportal.tjhf.com/tjhf/loginRegist/login?uname=13265468238&pwd=123456”; String uri = “https://www.baidu.com/”; 中间用到的证书为cer_test.crt,证书信息为:CN=console.haitest.com, C=CN。分别测试了加载证书与不加载证书请求3个不同的网址的日志。 证书为cer_test.crt,没有HostnameVerifier E/==####DROXY####===: (**)发送请求(get):https://mportal.haitest.com/hai/loginRegist/login?uname=13265468238&pwd=123456 E/==####DROXY####===: (**)响应结果:{“data”:72771,”result”:true,”resultCode”:2000} E/==####DROXY####===: (**)发送请求(get):https://mportal.hai.com/hai/loginRegist/login?uname=13265468238&pwd=123456 W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. E/==####DROXY####===: (**)发送请求(get):https://www.baidu.com/ W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 证书为cer_test.crt,HostnameVerifier :return true E/==####DROXY####===: (**)发送请求(get):https://mportal.haitest.com/hai/loginRegist/login?uname=13265468238&pwd=123456 E/==####DROXY####===: (**)响应结果:{“data”:72771,”result”:true,”resultCode”:2000} E/==####DROXY####===: (**)发送请求(get):https://mportal.hai.com/hai/loginRegist/login?uname=13265468238&pwd=123456 W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. E/==####DROXY####===: (**)发送请求(get):https://www.baidu.com/ W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 证书为cer_test.crt,HostnameVerifier :return hostname.equals(session.getPeerHost()) E/==####DROXY####===: (**)发送请求(get):https://mportal.haitest.com/hai/loginRegist/login?uname=13265468238&pwd=123456 E/==####DROXY####===: (**)响应结果:{“data”:72771,”result”:true,”resultCode”:2000} E/==####DROXY####===: (**)发送请求(get):https://mportal.hai.com/hai/loginRegist/login?uname=13265468238&pwd=123456 W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. E/==####DROXY####===: (**)发送请求(get):https://www.baidu.com/ W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 证书为null,没有HostnameVerifier E/==####DROXY####===: (**)发送请求(get):https://mportal.haitest.com/hai/loginRegist/login?uname=13265468238&pwd=123456 E/==####DROXY####===: (**)发送请求(get):https://mportal.hai.com/hai/loginRegist/login?uname=13265468238&pwd=123456 E/==####DROXY####===: (**)响应结果:{“data”:72771,”result”:true,”resultCode”:2000} E/==####DROXY####===: (**)发送请求(get):https://www.baidu.com/ E/==####DROXY####===: (*_*)响应结果: ...

2019年5月21日 · 5 分钟 · 天边的星星

Mysql日期处理

1.时间格式:在这个项目中,或许是由不同的人建立的数据库表结构吧,对时间的格式步统一,有的表中存储的long类型的时间戳,有的表中是存储的日期,有的表中存储的是时间,同时格式有20171225,2017-12-25等,一点都不统一。这样做,会对项目增加一些额外的工作量,同时会衍生出一些问题出来。比如,在写后台代码时,需要对时间做出处理,以适应数据库的时间格式;在进行夺标联合查询时,时间格式不统一,又会对sql语句进行时间格式转换,造成sql语句臃肿的情况。所以,在同一个项目中,时间格式应该保持统一。个人觉得long 类型的时间戳,以及String类型的yyyy-MM-dd HH:mm:ss 这两种方式时比较不错的。 long类型的时间戳,是因为后台java代码将date类型的时间转化为时间戳很容易。 String类型时因为,我们假如经常使用时间这个字段,在应用时不需要额外将Date类型转化为String类型,使用起来比较直观,方便。 2.常用时间语句 SELECT CURDATE():2017-12-25 //此时日期 SELECT NOW() : 2017-12-25 22:20:21 //此刻时间 SELECT YEAR(‘2017-12-25 22:27:45’): 2017 //获取时间的年份 SELECT MONTH(‘2017-12-25 22:27:45’): 12 //获取时间的月份 SELECT DAY(‘2017-12-25 22:27:45’):25 //获取时间的天数 SELECT HOUR(‘2017-12-25 22:27:45’):22 //获取时间的小时 SELECT MINUTE(‘2017-12-25 22:27:45’):27 //获取时间的分钟 SELECT SECOND(‘2017-12-25 22:27:45’):45 //获取时间的秒数 SELECT DATE_SUB(NOW(),INTERVAL 1 YEAR) //在目前的时间减去一年,该语句可以进行多种操作,指定时间下减去x年:DATE_SUB(“2017-12-25”,INTERVAL x YEAR),同时可以减去 x month/day/hour/minute/second等 SELECT ** DATE_ADD**(NOW(),INTERVAL 1 YEAR) //同上,在目前的时间上加上一年 SELECT CONCAT(‘2017′,’-12-12′):2017-12-12 //组装字符串,可以组装成任何时间格式,也可以使用如上语句,例如:SELECT CONCAT(YEAR(NOW()),’-12-12′) :2017-12-12 ; SELECT UNIX_TIMESTAMP(‘2017-12-25’):1514131200 //字符串转换成时间戳 SELECT FROM_UNIXTIME(1514131200) :2017-12-25 00:00:00 //时间戳转化为时间 ...

2019年5月9日 · 5 分钟 · 天边的星星

生成Kindle可读的mobi和PDF电子书

购买kindle之后,自然欣喜万分,不来自于工具本身,而来自于发现自己能够静下心来阅读长篇和复杂的文字了,可喜可贺。更重要的是,kindle减轻了我眼睛的莫大的压力。但马上就出现几个问题: 不是所有的电子书都有kindle,最常见的是扫描PDF 大量的论文无法阅读,这和上面的问题一致 网络上很多精彩的博客,新闻,都是没法阅读的 可能有人说,用手机看不就得了?用手机看花边娱乐新闻当然很好,可是当看数学推导时,推送栏上面妹子发来的消息,会直接把你的思路全部打乱。没用过kindle的人,是有些难以体会那种接近于纸张的质感的。OK,既然是程序员,我们就尝试解决这些问题。 有关kindlegen和HTML kindlegen是亚马逊官方出品的一个电子书生成工具。但它明显就没打算让普通用户使用,命令行界面,几乎没有任何像样的文档。只是在实例样例里给了几个生成电子书的文件。我就因为没有文档兜了大弯,翻遍国外各大网站,才慢慢摸清kindlegen的使用细节。 可以这么理解,KG是将一组HTML和相关文件,打包成mobi文件的工具。 最简单的例子,随意编写一个HTML文件,送给KG,会生成对应的mobi。基本有title,h1,h2,正文,kindle渲染就差不多了。如果需要修改样式,可以提供CSS文件。 但是,这样的做法,没有图片,没有超链接,无法提供目录,如果输入单一的大型HTML文件,kindle的渲染性能就不足了。 因此,需要生成层级化,多文件形式的html文件夹,然而kg并不能直接识别html文件夹,还是需要一些元数据描述。 编写元数据文件 要想解决这个问题,就需要编写两个文件,opf和ncx, 他们可以理解为KG的makefile, KG通过这两个文件索引HTML,目录和其他多媒体资源。介绍如下: [][1] 值得注意的是,所有的文件都应该保存在本地,尤其是jpg, html中的图片超链接,需要重定向到本地的jpg文件,如果依然在服务器上,据我所知,kg是不负责渲染下载的。 资源聚合文件: opf和ncx 由于opf文件非常重要,我们下面就讲解opf的格式: ![复制代码](https://common.cnblogs.com/images/copycode.gif) <metadata xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:opf=&quot;http://www.idpf.org/2007/opf&quot;> <dc:title>电子书标题</dc:title> <dc:language>en-us</dc:language> </metadata> <manifest> <!-- table of contents [mandatory] --> <item id=&quot;tochtml&quot; media-type=&quot;application/xhtml+xml&quot; href=&quot;toc.html&quot;/> <item id=&quot;item0&quot; media-type=&quot;application/xhtml+xml&quot; href=&quot;Artical-1277621753.html&quot;/> ... <!--下面是图片--> <item id=&quot;0.368541311142&quot; media-type=&quot;image/jpg&quot; href=&quot;Images/-1720404282.jpg&quot;/> </manifest> <spine toc=&quot;desertfire&quot;> <!-- 下面描述了KG生成电子书后文本的顺序 --> <itemref idref=&quot;toc&quot;/> <itemref idref=&quot;tochtml&quot;/> <itemref idref=&quot;item31&quot;/> </spine> <guide> <reference type=&quot;toc&quot; title=&quot;Table of Contents&quot; href=&quot;toc.html&quot;></reference> <reference type=&quot;text&quot; title=&quot;Welcome&quot; href=&quot;toc.html&quot;></reference> </guide> </package> &#96;&#96;&#96;" data-snippet-id="ext.b091e89925c72be7b07f9caa16092df4" data-snippet-saved="false" data-codota-status="done">&lt;package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="BookId"&gt; &lt;metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf"&gt; &lt;dc:title&gt;电子书标题&lt;/dc:title&gt; &lt;dc:language&gt;en-us&lt;/dc:language&gt; &lt;/metadata&gt; &lt;manifest&gt; &lt;!-- table of contents [mandatory] --&gt; &lt;item id="tochtml" media-type="application/xhtml+xml" href="toc.html"/&gt; &lt;item id="item0" media-type="application/xhtml+xml" href="Artical-1277621753.html"/&gt; ... &lt;!--下面是图片--&gt; &lt;item id="0.368541311142" media-type="image/jpg" href="Images/-1720404282.jpg"/&gt; &lt;/manifest&gt; &lt;spine toc="desertfire"&gt; &lt;!-- 下面描述了KG生成电子书后文本的顺序 --&gt; &lt;itemref idref="toc"/&gt; &lt;itemref idref="tochtml"/&gt; &lt;itemref idref="item31"/&gt; &lt;/spine&gt; &lt;guide&gt; &lt;reference type="toc" title="Table of Contents" href="toc.html"&gt;&lt;/reference&gt; &lt;reference type="text" title="Welcome" href="toc.html"&gt;&lt;/reference&gt; &lt;/guide&gt; &lt;/package&gt; <div class="cnblogs_code_toolbar"> <span class="cnblogs_code_copy"><a title="复制代码">![复制代码](https://common.cnblogs.com/images/copycode.gif)</a></span> </div> </div> [![image](https://images2015.cnblogs.com/blog/287060/201603/287060-20160307103012038-1762823801.png)][2] 需要注意的有以下几点: * 所有资源都需要一个id,命名任意,但不能重复 * media-type描述了资源的类型,记住两类基本就够用了,&#8221;application/xhtml+xml&#8221;代表HTML文件,&#8221;image/jpg&#8221;或 &#8220;image/png&#8221;代表图片。 * 其他都可以省略,只是会影响电子书完整性。 由于这两个文件内部其实都是html,所以修改编辑都很容易。 **最终,KG的命令行目标,不是目录HTML,而是OPF文件!**将所有的文件放入一个文件夹后,启动KG命令行,最后KG会在该目录下生成你心仪已久的mobi! ## 编辑HTML和OPF文件 知道其原理后,主要的任务是填充HTML和OPF文件,几页内容还好,如果内容繁多,不论是手工**( ⊙ o ⊙ )**,还是编程字符串拼接,都会变得异常低效。 此时,就需要**模板引擎**出手了,python推荐使用Jinja2, 资料众多,功能强大,性能尚可。生成opf的模板文件,基本就长下面这个样子: <div class="cnblogs_code"> <div class="cnblogs_code_toolbar"> <span class="cnblogs_code_copy"><a title="复制代码">![复制代码](https://common.cnblogs.com/images/copycode.gif)</a></span> </div> <div class="top-box hide"> <div class="alert-info"> </div> </div> {{ title }} en-us {% for item in navigation %} {% endfor %} {% for item in media %} {% endfor %} {% for item in navigation %} {% endfor %} " data-snippet-id="ext.1564f86c79babcc6b8778ebad334ce3f" data-snippet-saved="false" data-codota-status="done"><package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="BookId"> <metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf"> <dc:title>{{ title }}</dc:title> <dc:language>en-us</dc:language> </metadata> <manifest> <!-- table of contents [mandatory] --> <item id="toc" media-type="application/x-dtbncx+xml" href="toc.ncx"/> <item id="tochtml" media-type="application/xhtml+xml" href="toc.html"/> {% for item in navigation %} <item id="{{ item.id }}" media-type="application/xhtml+xml" href="{{ item.href }}"/> {% endfor %} {% for item in media %} <item id="{{ item.id }}" media-type="image/{{ item.format}}" href="{{ item.href}}"/> {% endfor %} </manifest> <spine toc="{{ title }}"> <!– the spine defines the linear reading order of the book –> <itemref idref=“toc”/> <itemref idref=“tochtml”/> {% for item in navigation %} <itemref idref="{{ item.id }}"/> {% endfor %} </spine> <guide> <reference type=“toc” title=“Table of Contents” href=“toc.html”></reference> <reference type=“text” title=“Welcome” href=“toc.html”></reference> </guide> </package> ...

2019年4月23日 · 4 分钟 · 天边的星星

pod私有库制作过程

一、创建podspec索引仓库,创建源文件仓库 在自己私有git分别创建上述两个仓库,如果有则不用创建 二、将podspec索引仓库添加到本地pod repo 在终端执行下述命令即可 pod repo add xxxSpecs 仓库地址 注:** 1.**其中xxxSpecs为本地资源文件夹名称,建议与仓库名称一致 2.仓库地址是自己在第一步创建的索引仓库地址 三、克隆源文件仓库并编写项目源码 四.在工程目录下创建podspec文件(注:需在同级目录下创建一个LICENSE文件) 创建podspec文件 1.移动到源文件工程目录 cd XXX/XXXX/XXXXX 2.在该目录下执行创建podspec文件命令 pod spec create [name] 注:[name]就是项目名称 3.在远程仓库的同级目录下创建LICENSE文件 注:使用MIT模板 4.在本地仓库进行更新刚才在远程仓库创建的文件 五、podspec文件每个字段的含义 Pod::Spec.new do |s| s.name = “xxx” 开源库的名称 s.version = “0.0.17″ 开源库版本 s.summary = “xxxx” 摘要 s.description = «-DESC 描述 天利和工具类,里面具有时间,弹框,视图等处理方法 DESC s.homepage = “http://xxxx/ios/xxxxProduct” 开源库首页 s.license = “MIT” 开源库协议文件 # s.license = { :type => “MIT”, :file => “FILE_LICENSE” } ...

2019年4月9日 · 1 分钟 · 天边的星星

Idea工具常用技巧总结

### 1.无处不在的跳转 注:这里的快捷键是自己定义的,并非大家的都一样,可以通过findAction查找相应的快捷键。 菜单栏选择”帮助/help”→FindAction(ctrl+shift+A)快速搜索想要查找命令。 我这里只演示windows平台使用的快捷键(eclipse版本KeyMap)。 1.1 项目窗口间的跳转 - 菜单栏选择window →Previous Project Window(ctrl+alt+左方括号) 1.2 文件之间的跳转 - 查看近期浏览文件 findaction(ctrl+shift+A) →输入recent files - Ctrl+E - 查看近期改动文件 recent changed files ⇔ ctrl+shift+e - 修改位置跳转 - 菜单栏&#8221;Navigate&#8221;→last edit location(ctrl+Q) - 反之 next edit location 可以自定义快捷键。 - 浏览位置跳转(光标停留位置) navigate →back(alt+向左箭头) 1.3 项目区与代码编辑区的相应跳转 - 项目区跳到右边代码编辑区 - 按ESC键 - 代码编辑区跳到左边项目区 - Alt+数字1 1.4 书签之间的跳转 - 利用书签跳转 - findaction→bookmarks→toggle bookmark(ctrl+shift+F11) - 带标记书签 bookmarks→toggle bookmarks with Mnemonic(ctrl+alt+shift+F11) - 标签间跳转 用ctrl+作标记的数字(这里有个坑我按小键盘数字没反应,得按大键盘的数字才行) 1.5 收藏夹 - 查看收藏夹 findaction→favorites(alt+2) - 可以看到我们的书签、收藏夹。 - 单独添加到收藏夹(自定义收藏夹) - findaction → add to favorites(Alt+shift+F) - 我们可以光标定位到某个函数、或是某个类添加到自定义的收藏夹中(add to new favorites list) 1.6 插件 - 调插件页面 findaction→输入plugins - 1.神器 emacsIdeas 安装 - browse repositories →emacIdeas→install→restart idea(重启Idea) - 配置emacsIdeas快捷键 settings/keymap/emacIdeas文件夹下AceJumpWord添加对应的快捷键。 - 按下刚配置的快捷键比如我这里shift+alt+K →按下要找的数字→输入任意高亮位置就跳转到对应位置了。 1.7 编辑区分屏 - 垂直分屏 - IntelliJ IDEA 支持对代码进行垂直或是水平分组,在打开的文件Tab上打开鼠标右键菜单,选择对应的split vertically功能即可 - 水平分屏 - 设为split horizontally即可。 1.8 代码格式化★ - 部分代码格式化 - 选中要格式化代码 ctrl+shift+F - 全部 - 直接ctrl+shift+F 2.高速定位代码 2.1 精准搜索 - 类 - 菜单栏 →Navigate →Class(Ctrl+shift+T) 其中include none..勾上就可以关联到Jar包里所依赖的类。 - 文件 - 菜单栏 navigate →file(ctrl+shift+r) - 符号 - 菜单栏 navigate →symbol(ctrl+alt+shift+n) - 字符串 - 菜单栏 edit→find→find in path(ctrl+H) 3.代码小助手 3.1 列操作 - 移动到当前单词尾部 - findaction →输入move caret to next word(ctrl+向右箭头) - 选中到当前单词尾部 (ctrl+shift+向右箭头) - 当前单词设置大小写切换 - edit→toggle case(ctrl+shift+u) - 移动到当前行首 - findaction→输入move caret to line start(Home键) - 移动到当前行尾 - findaction→输入move caret to line end(End键) - 将当前行的操作应用到相似行进行批量操作★ - 菜单栏edit→find→select all occurrences(ctrl+alt+Y) - 格式化下代码 - 菜单栏code→reformat code 3.2 live Template★ - main - findaction→输入live templates→点击右上角“+” - 输入缩写main 简介public static void main - 输入方法体 <div class="top-box hide"> <div class="alert-info"> </div> </div> ``` &lt;span class="hljs-function">&lt;span class="hljs-keyword">public&lt;/span> &lt;span class="hljs-keyword">static&lt;/span> &lt;span class="hljs-keyword">void&lt;/span> &lt;span class="hljs-title">main&lt;/span>&lt;span class="hljs-params">(String[] args)&lt;/span>&lt;/span>{ &lt;span class="katex math inline">END&lt;/span> } ...

2019年3月27日 · 3 分钟 · 天边的星星

SpringBoot消失的Web.xml

Filter 过滤器作为web.xml中重要的一部分,有着相当高的出场率,SpringBoot会默认注册几个Filter ApplicationContextHeaderFilter CharacterEncodingFilter 如果添加了Security依赖的话会加入SpringSecurityFilterChain 如果加入Actuator依赖的话就会加入WebRequestTraceFilter 实现自己的Filter JavaConfig注册Bean 我们如果自己要实现自己的Filter的话,需要实现Filter并实现其中的方法 同时要利用JavaConfig的方法来配置,一般情况下需要编写@Bean注解的返回值为FilterRegistrationBean的方法来实现JavaBean的注册 具体实现如下 需要注意的是此方法需要在被@Configuration注解的配置类中 @WebFilter+@ServletComponentScan 如果觉得Java代码的方式比较繁琐的话可以采用注解方式注册Filter,具体实现方式是在Filter实现类加入@WebFilter注解 例如 然后在SpringBootApplication类上添加@ServletComponentScan Filter的注册原理 我们采用JavaConfig的形式实现了Filter的注册,通过向上追溯得知FilterRegistrationBean的层级结构如下 ServletContextInitializer RegistrationBean AbstractFilterRegistrationBean FilterRegistrationBean 经查阅SpringBoot文档发现针对ServletContextInitializer的描述如下 Interface used to configure a Servlet 3.0+ context programmatically. Unlike WebApplicationInitializer, classes that implement this interface (and do not implement WebApplicationInitializer) will not be detected by SpringServletContainerInitializer and hence will not be automatically bootstrapped by the Servlet container. This interface is primarily designed to allow ServletContextInitializers to be managed by Spring and not the Servlet container. ...

2019年3月19日 · 1 分钟 · 天边的星星

阿里云OSS之Nginx反向代理配置

nginx配置 设置代理 upstream ossproxy{ server zcpcimgs.oss-cn-beijing.aliyuncs.com; } 配置代理 server { listen 80; server_name zc2019.com; location /data { proxy_pass http://ossproxy; proxy_redirect off; proxy_set_header Host zcpcimgs.oss-cn-beijing.aliyuncs.com; proxy_set_header X-Real-IP remote_addr; proxy_set_header X-Forwarded-Forproxy_add_x_forwarded_for; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_max_temp_file_size 0; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; } location / { # root html; # index index.html index.htm; proxy_pass http://zcjfweb; # 真实信息 proxy_set_header Host host; proxy_set_header X-Real-IPremote_addr; proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for; client_max_body_size 100M; proxy_read_timeout 30000; proxy_send_timeout 75s; #proxy_redirect off; #proxy_pass_header Set-Cookie; #proxy_hide_header X-Powered-By; #proxy_hide_header X-Mod-Pagespeed; #proxy_ignore_client_abort off; #proxy_cache_valid any 10m; #proxy_connect_timeout 75s; #proxy_read_timeout 75s; #proxy_send_timeout 75s; } ...

2019年3月19日 · 2 分钟 · 天边的星星

微信分享链接的缩略图和标题

一、微信内分享 在微信内打开链接后,点右上角【…】选择【发送给朋友】或【分享到朋友圈】,这种分享方式获取缩略图的方法: 方法一:在页面 body 最上方添加 300*300 像素的 img 如该图片不需要显示,可以用 css 隐藏,但不能直接对 img 设置 display: none;。 可以在父层 div 上设置 display: none; 或者对 img 设置 position: absolute; visibility: hidden;。 <img src=&quot;/img/thumbnail.png&quot; alt=&quot;&quot;></div> 1 " data-snippet-id="ext.2607b3963245b14ba18790d96be6e596" data-snippet-saved="false" data-codota-status="done">`&lt;div style="display:none;"&gt;&lt;img src="/img/thumbnail.png" alt=""&gt;&lt;/div&gt;` 方法二:通过微信 JS-SDK 的分享接口 这种方法需要一个微信公众号的 app_id,同时需要一个后端服务生成 signature。好处是可以定制分享的标题、缩略图、描述。 二、从浏览器分享 在浏览器打开链接后,点分享图标,选择【微信】,这种分享方式获取缩略图的方法: 在页面的 head 部分添加 Open Graph Metadata: <meta property=&quot;og:title&quot; content=&quot;页面标题&quot;> <meta property=&quot;og:description&quot; content=&quot;页面描述&quot;> <meta property=&quot;og:image&quot; content=&quot;http://www.example.com/img/thumbnail.png&quot;> <meta property=&quot;og:url&quot; content=&quot;http://www.example.com/&quot;> 1 2 3 4 5 " data-snippet-id="ext.d5f2b073507882789543238b1b2f0a2b" data-snippet-saved="false" data-codota-status="done">`&lt;meta property="og:type" content="website" /&gt; &lt;meta property="og:title" content="页面标题"&gt; &lt;meta property="og:description" content="页面描述"&gt; &lt;meta property="og:image" content="http://www.example.com/img/thumbnail.png"&gt; &lt;meta property="og:url" content="http://www.example.com/"&gt;` 其中 og:image 影响浏览器分享时的图标,需要指定图片的完整路径。 ...

2019年3月2日 · 2 分钟 · 天边的星星

H5自动播放音频

方法一 监听界面元素 监听界面 //–创建页面监听,等待微信端页面加载完毕 触发音频播放 document.addEventListener(‘DOMContentLoaded’, function () { function audioAutoPlay() { var audio = document.getElementById(‘audio’); audio.play(); document.addEventListener(“WeixinJSBridgeReady”, function () { audio.play(); }, false); } audioAutoPlay(); }); //–创建触摸监听,当浏览器打开页面时,触摸屏幕触发事件,进行音频播放 document.addEventListener(‘touchstart’, function () { function audioAutoPlay() { var audio = document.getElementById(‘audio’); audio.play(); } audioAutoPlay(); }); // var firstTouch = true; $(“body”).bind(“touchstart”,function(e) { if ( firstTouch ) { firstTouch = false; document.getElementById(‘audio’).play(); }else{ return; } }); // $(“body”).one(“touchstart”,function() { document.getElementById(‘audio’).play(); }); ...

2019年2月28日 · 2 分钟 · 天边的星星

linux中java执行脚本守护脚本

#/bin/bash while true; do count=`ps -ef | grep test.jar | grep -v grep|wc -l` if [ ${count} -lt 1 ]; then nohup java -jar xxx.jar >log.out 2>&1 & else echo “process is running” fi sleep 3 done Linux Shell脚本:自动读取pid并关闭进程 查询进程信息 ps -ef|grep elasticsearch 过滤掉grep进程 ps -ef|grep elasticsearch|grep -v grep 提取pid(awk以空格分割,显示第二个变量即为pid) ps -ef|grep elasticsearch|grep -v grep|awk ‘{print $2}’ 根据pid kill掉该进程 完整脚本如下所示

2019年2月22日 · 1 分钟 · 天边的星星