Winscp默认用账号密码登陆,用私钥文件登陆须要在高级选项里面的SSH--验证里面选择文件。
Winscp使用的是putty做为SSH登陆工具,而puttygen所生成的是以.ppk结尾的密钥文件。
若是是pub类型的须要转换为putty类型的,文件类型里选择全部文件,选择密钥文件会提示你是否转换,按提示操做转换保存后就会自动选择转换后的.ppk密钥文件了。
jdk8的新特性之时间
import java.time.ZonedDateTime; import java.time.ZoneId; public class Java8Tester { public static void main(String args[]){ Java8Tester java8tester = new Java8Tester(); java8tester.testZonedDateTime(); } public void testZonedDateTime(){ // 获取当前时间日期 ZonedDateTime date1 = ZonedDateTime.parse("2015-12-03T10:15:30+05:30[Asia/Shanghai]"); System.out.println("date1: " + date1); ZoneId id = ZoneId.of("Europe/Paris"); System.out.println("ZoneId: " + id); ZoneId currentZone = ZoneId.systemDefault(); System.out.println("当期时区: " + currentZone); }
jdk8 技术总结
1 使用 google工具类实现一行添加数据新建list
com.google.common.collect.Lists
2 list 的 foreach的两种方式
::双冒号和 拉姆达表达式
3 求和 ,过滤,跳过等操做
import com.google.common.collect.Lists; import org.junit.Test; import java.lang.annotation.*; import java.nio.charset.StandardCharsets; import java.time.*; import java.util.*; import java.util.concurrent.ThreadLocalRandom; import java.util.function.Supplier; /** * * @ClassName:JDK8_features * @Description:JDK8新特性 * @author diandian.zhang * @date 2017年4月17日上午9:13:24 */ public class JDK8_features { public List<Integer> list = Lists.newArrayList(1,2,3,4,5,6,7,8,9,10); /** * 1.Lambda表达式 */ @Test public void testLambda(){ list.forEach(System.out::println); list.forEach(e -> System.out.println("方式二:"+e)); } /** * 2.Stream函数式操做流元素集合 */ @Test public void testStream(){ List<Integer> nums = Lists.newArrayList(1,1,null,2,3,4,null,5,6,7,8,9,10); System.out.println("求和:"+nums .stream()//转成Stream .filter(team -> team!=null)//过滤 .distinct()//去重 .mapToInt(num->num*2)//map操做 .skip(2)//跳过前2个元素 .limit(4)//限制取前4个元素 .peek(System.out::println)//流式处理对象函数 .sum());// } /** * 3.接口新增:默认方法与静态方法 * default 接口默认实现方法是为了让集合类默认实现这些函数式处理,而不用修改现有代码 * (List继承于Iterable<T>,接口默认方法没必要须实现default forEach方法) */ @Test public void testDefaultFunctionInterface(){ //能够直接使用接口名.静态方法来访问接口中的静态方法 JDK8Interface1.staticMethod(); //接口中的默认方法必须经过它的实现类来调用 new JDK8InterfaceImpl1().defaultMethod(); //多实现类,默认方法重名时必须复写 new JDK8InterfaceImpl2().defaultMethod(); } public class JDK8InterfaceImpl1 implements JDK8Interface1 { //实现接口后,由于默认方法不是抽象方法,重写/不重写都成! // @Override // public void defaultMethod(){ // System.out.println("接口中的默认方法"); // } } public class JDK8InterfaceImpl2 implements JDK8Interface1,JDK8Interface2 { //实现接口后,默认方法名相同,必须复写默认方法 @Override public void defaultMethod() { //接口的 JDK8Interface1.super.defaultMethod(); System.out.println("实现类复写重名默认方法!!!!"); } } /** * 4.方法引用,与Lambda表达式联合使用 */ @Test public void testMethodReference(){ //构造器引用。语法是Class::new,或者更通常的Class< T >::new,要求构造器方法是没有参数; final Car car = Car.create( Car::new ); final List< Car > cars = Arrays.asList( car ); //静态方法引用。语法是Class::static_method,要求接受一个Class类型的参数; cars.forEach( Car::collide ); //任意对象的方法引用。它的语法是Class::method。无参,全部元素调用; cars.forEach( Car::repair ); //特定对象的方法引用,它的语法是instance::method。有参,在某个对象上调用方法,将列表元素做为参数传入; final Car police = Car.create( Car::new ); cars.forEach( police::follow ); } public static class Car { public static Car create( final Supplier< Car > supplier ) { return supplier.get(); } public static void collide( final Car car ) { System.out.println( "静态方法引用 " + car.toString() ); } public void repair() { System.out.println( "任意对象的方法引用 " + this.toString() ); } public void follow( final Car car ) { System.out.println( "特定对象的方法引用 " + car.toString() ); } } /** * 5.引入重复注解 * 1.@Repeatable * 2.能够不用之前的“注解容器”写法,直接写2次相同注解便可 * * Java 8在编译器层作了优化,相同注解会以集合的方式保存,所以底层的原理并无变化。 */ @Test public void RepeatingAnnotations(){ RepeatingAnnotations.main(null); } /** * 6.类型注解 * 新增类型注解:ElementType.TYPE_USE 和ElementType.TYPE_PARAMETER(在Target上) * */ @Test public void ElementType(){ Annotations.main(null); } /** * 7.最新的Date/Time API (JSR 310) */ @Test public void DateTime(){ //1.Clock final Clock clock = Clock.systemUTC(); System.out.println( clock.instant() ); System.out.println( clock.millis() ); //2. ISO-8601格式且无时区信息的日期部分 final LocalDate date = LocalDate.now(); final LocalDate dateFromClock = LocalDate.now( clock ); System.out.println( date ); System.out.println( dateFromClock ); // ISO-8601格式且无时区信息的时间部分 final LocalTime time = LocalTime.now(); final LocalTime timeFromClock = LocalTime.now( clock ); System.out.println( time ); System.out.println( timeFromClock ); // 3.ISO-8601格式无时区信息的日期与时间 final LocalDateTime datetime = LocalDateTime.now(); final LocalDateTime datetimeFromClock = LocalDateTime.now( clock ); System.out.println( datetime ); System.out.println( datetimeFromClock ); // 4.特定时区的日期/时间, final ZonedDateTime zonedDatetime = ZonedDateTime.now(); final ZonedDateTime zonedDatetimeFromClock = ZonedDateTime.now( clock ); final ZonedDateTime zonedDatetimeFromZone = ZonedDateTime.now( ZoneId.of( "America/Los_Angeles" ) ); System.out.println( zonedDatetime ); System.out.println( zonedDatetimeFromClock ); System.out.println( zonedDatetimeFromZone ); //5.在秒与纳秒级别上的一段时间 final LocalDateTime from = LocalDateTime.of( 2014, Month.APRIL, 16, 0, 0, 0 ); final LocalDateTime to = LocalDateTime.of( 2015, Month.APRIL, 16, 23, 59, 59 ); final Duration duration = Duration.between( from, to ); System.out.println( "Duration in days: " + duration.toDays() ); System.out.println( "Duration in hours: " + duration.toHours() ); } /** * 8.新增base64加解密API */ @Test public void testBase64(){ final String text = "就是要测试加解密!!abjdkhdkuasu!!@@@@"; String encoded = Base64.getEncoder() .encodeToString( text.getBytes( StandardCharsets.UTF_8 ) ); System.out.println("加密后="+ encoded ); final String decoded = new String( Base64.getDecoder().decode( encoded ), StandardCharsets.UTF_8 ); System.out.println( "解密后="+decoded ); } /** * 9.数组并行(parallel)操做 */ @Test public void testParallel(){ long[] arrayOfLong = new long [ 20000 ]; //1.给数组随机赋值 Arrays.parallelSetAll( arrayOfLong, index -> ThreadLocalRandom.current().nextInt( 1000000 ) ); //2.打印出前10个元素 Arrays.stream( arrayOfLong ).limit( 10 ).forEach( i -> System.out.print( i + " " ) ); System.out.println(); //3.数组排序 Arrays.parallelSort( arrayOfLong ); //4.打印排序后的前10个元素 Arrays.stream( arrayOfLong ).limit( 10 ).forEach( i -> System.out.print( i + " " ) ); System.out.println(); } /** * 10.JVM的PermGen空间被移除:取代它的是Metaspace(JEP 122)元空间 */ @Test public void testMetaspace(){ //-XX:MetaspaceSize初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整 //-XX:MaxMetaspaceSize最大空间,默认是没有限制 //-XX:MinMetaspaceFreeRatio在GC以后,最小的Metaspace剩余空间容量的百分比,减小为分配空间所致使的垃圾收集 //-XX:MaxMetaspaceFreeRatio在GC以后,最大的Metaspace剩余空间容量的百分比,减小为释放空间所致使的垃圾收集 } } interface JDK8Interface1 { //1.接口中能够定义静态方法了 public static void staticMethod(){ System.out.println("接口中的静态方法"); } //2.使用default以后就能够定义普通方法的方法体了 public default void defaultMethod(){ System.out.println("接口中的默认方法"); } } interface JDK8Interface2 { //接口中能够定义静态方法了 public static void staticMethod(){ System.out.println("接口中的静态方法"); } //使用default以后就能够定义普通方法的方法体了 public default void defaultMethod(){ System.out.println("接口中的默认方法"); } } /** * * @ClassName:RepeatingAnnotations * @Description:重复注解@Repeatable * @author diandian.zhang * @date 2017年3月31日下午3:48:13 */ class RepeatingAnnotations { @Target( ElementType.TYPE ) @Retention( RetentionPolicy.RUNTIME ) public @interface Filters { Filter[] value(); } @Target( ElementType.TYPE ) @Retention( RetentionPolicy.RUNTIME ) @Repeatable( Filters.class ) public @interface Filter { String value(); String value2(); }; @Filter( value="filter1",value2="111" ) @Filter( value="filter2", value2="222") //@Filters({@Filter( value="filter1",value2="111" ),@Filter( value="filter2", value2="222")}).注意:JDK8以前:1.没有@Repeatable2.采用本行“注解容器”写法 public interface Filterable { } public static void main(String[] args) { //获取注解后遍历打印值 for( Filter filter: Filterable.class.getAnnotationsByType( Filter.class ) ) { System.out.println( filter.value() +filter.value2()); } } } /** * * @ClassName:Annotations * @Description:新增类型注解:ElementType.TYPE_USE 和ElementType.TYPE_PARAMETER(在Target上) * @author diandian.zhang * @date 2017年3月31日下午4:39:57 */ class Annotations { @Retention( RetentionPolicy.RUNTIME ) @Target( { ElementType.TYPE_USE, ElementType.TYPE_PARAMETER } ) public @interface NonEmpty { } public static class Holder< @NonEmpty T > extends @NonEmpty Object { public void method() throws @NonEmpty Exception { } } public static void main(String[] args) { final Holder< String > holder = new @NonEmpty Holder< String >(); @NonEmpty Collection< @NonEmpty String > strings = new ArrayList<>(); } }
1 echart数据才会刷新,须要设置true
this.currchart1=echarts.init(document.getElementById('chart1')).setOption(option,true);
2 获取属性个数
Object.keys(abc).length
3 遍历 对象的方法
abc={a:1,b:2};
{a: 1, b: 2}
for(k in abc){console.log(k)}
VM158:1 a
VM158:1 b
4 使用parseFloat 解决 数字字符串相加问题
parseFloat(d.doorClose_average_vibrationX)+parseFloat(d.doorClose_envelope_vibrationX)]
5 使用mongodb原生的in的例子
BasicDBList values = new BasicDBList();
values.add(30);
values.add(50);
queryCondition.put("a", new BasicDBObject("$in", values));
或用第二种方法
condition.put("loadClass",new BasicDBObject("$in","我是java数组"));
1 jdk自带的 经常使用命令
jad xxx.class
会生成 反编译的 文件xxxx
2 jmap 进程对 内存的使用状况
jmap -histo:live 2743
jmap 2743
jmap -heap 38574
3 jstat 对资源和性能的监控,包括老生代,新生代等等所有都有
4 jstack 打印线程堆栈快照信息,分析现场等待,思索问题
1.想拷贝别人项目到本身账号下就fork一下。 2.持续关注别人项目更新就star一下 3.watch是设置接收邮件提醒的。
好的方式
好用的英文字体
Times New Roman
5 spring boot 邮件发送方法
1 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> 2 邮件配置 spring.mail.host=smtp.gmail.com spring.mail.username=<your email username> spring.mail.password=<your email password> spring.mail.default-encoding=utf-8 #If you use Gmail, the follow two lines are necessary spring.mail.properties.mail.smtp.socketFactory.port = 465 spring.mail.properties.mail.smtp.socketFactory.class = javax.net.ssl.SSLSocketFactory 3 import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class DemoApplicationTests { @Test public void contextLoads() { sendSimpleMail("","title","content"); } @Value("${spring.mail.username}") private String from; @Autowired private JavaMailSender mailSender; public void sendSimpleMail(String to, String subject, String content) { SimpleMailMessage message = new SimpleMailMessage(); message.setTo("xxxxx@qq.com"); message.setSubject(subject); message.setText(content); message.setFrom(from); mailSender.send(message); } }
1 mqtt 打debug调试会致使mqtt连接中断(由于超时?)
踩坑总结
nknown custom element did you register the component correc 由于没有注册组件
少计算了一个data,致使数据为空,
少计算了 flag为ture致使都没数据
最终使用合并的数据列
很重要须要选好时机
this.$nextTick(function(){
this.drawCharts3D(this.chartParams);//画3d图
return;
})
new Date().toJSON()
"2019-08-21T21:46:03.555Z"
cst 和sgt 时区相同
EEE MMM dd HH:mm:ss zzz yyyy
BaseCalendar.Date date = normalize();
TimeZone zi = date.getZone();
if (zi != null) {
sb.append(zi.getDisplayName(date.isDaylightTime(), TimeZone.SHORT, Locale.US)); // zzz
} else {
sb.append("GMT");
}
ZZZ是 +0800
2019-08-22 05:59:45 +0800
zzz 是CST/SGT
只用 三行 就够了 simpledateformat,能够格式化为字符串,也可解析字符串为时间
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss zzz");
System.out.println(format.format(new Date()));
System.out.println("============"+format.parse("2019-04-03 03:22:11 CST"));
2019-08-22 06:16:45 CST
============Wed Apr 03 03:22:11 CST 2019
1 时间出错缘由居然是由于 日期自动转为了java的date到mongo的 timestamp,致使再转出来的时候已经格式不匹配了
没法long转为 date
shiro 拦截器的正常思路:
loginservice新添加
userservice添加 @lazy
handler的拦截器
HandlerInterceptorAdapter 继承 实现preHandler方法
功能有
1 判读若是不是Handler handler不是 HandlerMethod 类型映射的方法直接放过
2 若是是swagger直接放过
3 若是是errorhtml直接抛出异常被捕获后html跳转
4 若是是errorhtml直接放过
5 从header获取等3个地方获取token
从Authorization获取,
从api_key获取(考虑万一是从swagger也用token),两个key均可以
若是header的为空,从token获取,key是token
若是cookie为空从参数获取 key为token
6 判断为空
des解密
判断为空
解析字符串为Token对象
token包含了type是否为web和手机
若是手机不退出就用于在线,判读除了web的都是true
web须要判断时间的有效性,默认12小时有效
7 再次检测token是否为空和保存的user是否为空
8 再次检测传递的user是否为空
9 检测token在redis中存储是否过时,经过判断token_开头的是否存在
redis.get(token_+userid)的方式
10 再次检测传递的token和redistoken是否一致,判断设备
11 查询user是否在db中存在,没有从新登陆,有的话状态为2 从新登陆
12 没明白 token_expires_的用法
cron的表达式使用
Quartz使用相似于Linux下的Cron表达式定义时间规则,Cron表达式由6或7个由空格分隔的时间字段组成,如表1所示: 表1 Cron表达式时间字段 位置 时间域名 容许值 容许的特殊字符 1 秒 0-59 , - * / 2 分钟 0-59 , - * / 3 小时 0-23 , - * / 4 日期 1-31 , - * ? / L W C 5 月份 1-12 , - * / 6 星期 1-7 , - * ? / L C # 7 年(可选) 空值1970-2099 , - * / Cron表达式的时间字段除容许设置数值外,还可以使用一些特殊的字符,提供列表、范围、通配符等功能,细说以下: ●星号(*):可用在全部字段中,表示对应时间域的每个时刻,例如,*在分钟字段时,表示“每分钟”; ●问号(?):该字符只在日期和星期字段中使用,它一般指定为“无心义的值”,至关于点位符; ●减号(-):表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12; ●逗号(,):表达一个列表值,如在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五; ●斜杠(/):x/y表达一个等步长序列,x为起始值,y为增量步长值。如在分钟字段中使用0/15,则表示为0,15,30和45秒,而5/15在分钟字段中表示5,20,35,50,你也可使用*/y,它等同于0/y;
在恰当的断字点进行换行: p.test {word-break:hyphenate;} break-all 自适应 范围 通常数据库链接 后缀 ?serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull 设置颜色的几种方式 background-color:rgb(255,0,255); border:1px solid rgb(112, 197, 236);
=========================》》》》》》》》》》》》》》》》》》》》》》
1 三大特性: CAS
高并发,高可见,高性能, 悲观锁安全,每次来都必须占用锁, select for update,这样致使低性能
乐观锁,先相信,而后比较 version或者 时间戳,用的多,可是高并发时错误率低,由于修改的多,这个时缺点,瑕不掩瑜
idea 热部署的四个步骤 查看端口对应进程号 netstat -ano |findstr 9091 窗口变化触发事件 addEventListener('resize',function(){alert(1)})
openssl的使用方法:
----------------------------
openssl 用法:
d:\openssl>set RANDFILE=d:\openssl\.rnd
d:\openssl>set OPENSSL_CONF=d:\openssl\OpenSSL-Win64\bin\openssl.cfg
先要进去 openssl.exe
生成私钥
genrsa -out ca.key 2048
根据私钥生成公钥
rsa -in ca.key -out ca.key.public
根据私钥生成证书