0%

文章字数:65,阅读全文大约需要1分钟
tomcat在jdk的三个类加载器下增加了share,webApp加载器,多个webApp用于TomCat下不同的应用,防止不同程序相同的类冲突。shre用于提取不同app下相同的类。如同版本的Spring


文章字数:285,阅读全文大约需要1分钟

这是java并发包java.util.concurrent下的一个用于定义时间粒度、时间转换、线程休眠的工具类。

枚举量

1
2
3
4
5
6
7
SECONDS:秒
MINUTES:分
HOURS:时
DAYS:日
NANOSECONDS:纳秒,等于1*10^-9 s
MICROSECONDS:微妙 1*10^-6 s
MILLISECONDS:毫秒 1*10^-3 s

常用方法

  1. toHours(long duration):
    粒度之间都有类似的方法

    1
    2
    // 一天几个小时
    Long dayToHour = TimeUnit.DAYS.toHours(1);//24
  2. convert(long sourceDuration, TimeUnit sourceUnit)

    1
    2
    // 48小时转换成天
    TimeUnit.DAYS.convert(48, TimeUnit.HOURS);//2
  3. sleep(long timeout)
    可读性更好的线程休眠操作

    1
    2
    //休眠两分钟
    TimeUnit.SECONDS.sleep(2);
  4. timedJoin(Thread thread, long timeout)

    1
    2
    //指定线程休眠指定毫秒数
    TimeUnit.SECONDS.timedJoin(Thread.currentThread(), 2);
  5. timedWait(Object obj, long timeout)

    1
    2
    3
    4
    5
    //休眠指定对象
    public synchronized void show() throws InterruptedException {
    TimeUnit.SECONDS.timedWait(this, 2);
    System.out.println("HelloWorld");
    }

文章字数:54,阅读全文大约需要1分钟
操作不支持的异常,使用jpa分页的到的List进行addAll操作是抛出的异常。

原因

查看Page的源码,发现返回的List是不可修改的list

1
2
3
public List<T> getContent() {
return Collections.unmodifiableList(content);
}

文章字数:145,阅读全文大约需要1分钟

意外的终止输入,浏览器读取我们的javascript代码时,碰到了不可预知的错误,导致无法继续解析下去。

今天遇到这个问题,开发的时候没问题,软件打包测试时前端抛出这个错误。
首先想到是不是标签没结束之类的,检查了一遍提交的代码没有发现异常。
之后考虑到前端有做压缩,然后思考是不是注释的问题。最后发现有一处\\的注释,删除运行正常。


文章字数:132,阅读全文大约需要1分钟

IBM Security App Scan Standard 是IBM的一款web安全扫描工具,可以利用爬虫技术进行网站安全渗透测试,根据网站入口自动对网页链接进行安全扫描,扫描之后会提供扫描报告和修复建议等。

工作原理

  1. 通过探索了解整个web页面结果
  2. 通过分析,使用扫描规则库对修改的HTTP Request进行攻击尝试
  3. 分析 Response 来验证是否存在安全漏洞

文章字数:557,阅读全文大约需要2分钟

介绍

ZGCJDK11之后带来的全新垃圾回收器,主要目标是降低停顿时间,但是会一定程度上降低吞吐量。

  • 主要目标
  1. 支持TB级别的堆
  2. 最大停顿不超过10ms,无论堆的大小,这个数据都不会变
  3. 奠定未来GC特性的基础
  4. 最糟糕的情况下吞吐量只降低15%,不过可以用横向扩容解决

机制

  1. Pause Mark Start暂停标记阶段,找到当前活跃的引用。此阶段速度很快,会造成短暂的停顿
  2. Concurrent Mark并发标记阶段,从上一步基础上继续往下标记存活对象。在并发结束后会有一个端在的停顿,确保所有对象都被标记
  3. Concurrent Prepare for Relocate准备阶段,并发选取接下来需要标记整理的对象。结束后会有一个端在的停顿,用于移动root集合对象的引用
  4. Concurrent Relocate移动上一阶段标记存活的对象,并整理

特性

  1. 没有分代,分代实现较为麻烦,目前没有分代
  2. Region Based,ZGC的内存空间被分为三类规格的空间,2MB32MBN*2MB,灵活性更好
  3. Partial Compaction部分压缩

文章字数:165,阅读全文大约需要1分钟

  1. YGC:对新生代堆进行gc,即young GC。频率较高,edn空间不足时会执行,此时会回收大部分对象。性能消耗较小
  2. FGC:全堆范围的gc默认堆空间达到80%时触发fgc。触发频率较低,7-10天可能才会触发一次。old空间、perm空间不足,调用System.gc()ygc的悲观策略、dump live的内存信息时(jmap –dump:live)都会触发

悲观策略
当jvm计算ygc之后需要晋升的空间大于剩余空间时就会直接执行一次fgc,因为反正晋升之后也需要执行一次。


文章字数:297,阅读全文大约需要1分钟

activeMQ本身只支持通过配置文件配置用户名和密码的方式管理连接,但是实际使用中 用户名和密码都是动态分配的。最后在网上找到了一个给activeMQ开发插件鉴权的方法。

大致步骤

  1. 创建一个java application,并添加activeMQ的依赖。版本和部署的版本保持一致。

  2. 创建一个broker plunin类,并返回一个Broker的子类。这个子类就是控制连接鉴权的。

1
2
3
4
5
6
7
import org.apache.activemq.broker.*;

public class LoginAhthPlugin implements BrokerPlugin{
public Broker installPlugin(Broker broker) throw Exception{
reutrn new AuthFilter(broker);
}
}

3.实现AuthFilter,重写addConnection方法,进行权限校验。失败抛出SecurityException,提示用户名密码错误。验证成功调用传入的brokeraddConnection方法。

1
2
3
4
5
6
7
8
9
10
// 调用父类构造方法,传入broker
public AuthFilter(Broker next){
super(next);
}
@Override
publuc void addConnection(ConnectionContext context, ConnectionInfo info)throw Exception{
// 鉴权,失败抛出异常
auth(info.getUserName(),info.getPassword(),info.getClientId());
super.addConnection(context,info);
}
  1. 通过配置文件加入插件

activemq.xml

1
2
3
4
5
6
7
8
9
<!-- 其它同级的地方可以配置注入spring的bean,完成数据库的配置 -->
<broker ...>
<!-- 在这个标签中加入 -->
<plugins>
<bean xmlns="http://www.springframework.org/schema/beans" id="LoginAuthPlugin" class="com.study.mqttatuh.LoginAuthPlugin">
</bean>
</plugins>

</broker>

文章字数:313,阅读全文大约需要1分钟

第一步,生成证书

  1. 生成证书以及导入受信证书
  2. 放在ActiveMQ安装目录下/conf/新建cert目录,并放入证书

第二步,配置证书

  • activemq.xml子节点增加证书配置
1
2
3
4
5
6
7
<sslContext>
<sslContext keyStore="file:${activemq.base}/conf/cert/broker.keystore"
keyStorePassword="broker123"
trustStore="file:${activemq.base}/conf/cert/broker.truststore"
trustStorePassword="brokerTrust123"
/>
</sslContext>

第三步,增加mqtt+ssl协议

  1. 单向认证配置,即不会去验证客户端连接的证书
1
<transportConnector name="mqtt+ssl" uri="mqtt+ssl://0.0.0.0:1883?maximumConnections=30000&wireFormat.maxFrameSize=204857600"/>
  1. 双向认证,客户端的证书需要可以被truststore认证通过(自签的话就是需要把证书先导入到ActiveMqtruststore
1
<transportConnector name="mqtt+ssl" uri="mqtt+ssl://0.0.0.0:1883?maximumConnections=30000&wireFormat.maxFrameSize=204857600&needClientAuth=true"/>

文章字数:1116,阅读全文大约需要4分钟

Android Debug Bridge安卓调试桥,是一款C/S架构的命令行工具。

组成部分

  1. Client:运行在PC端,对Android应用进行安装、卸载、调试。
  2. Service:运行在PC端,管理客户端到设备的abd后台进程的连接
  3. adb进程:运行在Android设备5037端口

adb命令

命令格式:

1
adb [-e | -d | -s <设备序列号>] <子命令>
  1. adb devices获取设备列表及设备状态

  2. adb get-state获取设备的状态,device正常连接、offline连接异常无响应、unknown没有连接设备

  3. adb kill-server | abd start-server:结束或者启动adb服务,状态异常是kill-server再start

  4. adb logcat:打印Android的系统日志

  5. adb bugreport:打印dumpsysdumpstatelogcat的输出,用于错误分析

  6. adb install:安装应用,覆盖安装-r

  7. adb uninstall:卸载应用,后面跟应用包名。-k选项保留数据和缓存目录

  8. adb pull:将Android设备上的文件或者文件夹复制到本地

    1
    adb pull xxx/a.txt d:\xxx.txt
  9. adb push:推送本地文件到Android设备

    1
    2
    # 最后的'/'一定要有,否则报错
    adb push d:\push.txt sdcard/test/
  10. adb root , adb remount:部分手机支持,获取root权限,系统文件为可读状态

  11. adb reboot:重启设备

    1
    2
    3
    4
    5
    # 重启,进入fastboot模式
    adb reboot-bootloader

    # 重启,进入recovery模式
    adb recovery
  12. adb foward:将宿主机上的某个端口重定向到设备的某个端口

    1
    2
    # 把主机1214端口的信息数据都转发到设备的8888端口,实现远程控制
    adb forward tcp:1214 tcp :8888
  13. adb connect:远程链接Android设备

    1
    2
    3
    1. pc,设备处于同一网段
    2. 手机root,安装adbWireless,运行
    3.adb connect ip
  14. adb disconnect <ip>断开连接
    不断开连接别人的adb就登录不上去

adb shell命令

1
2
# 调用安卓设备上`system/bin`目录下的脚本程序
adb shell 命令
  1. adb shell pm list package:列出安装在设备上的应用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # 系统应用
    adb shell pm list package -s

    # 第三方应用
    adb shell pm list package -3

    # 应用包名及对应apk名及位置
    adb shell pm list package -f

    # 查看安装来源
    # 例:package:com.zhihu.android installer=com.xiaomi.market
    adb shell pm list package -i

    # 查找关键字 -f | -FILTER
    adb shell pm list package -f -3 -i 关键字
  2. adb shell pm path packageName:列出包名对应的apl位置

  3. pm list instrumentation:列出含有单元测试case的应用,可加-f参数

  4. pm dump package:列出指定应用的dump信息

  5. pm install:安装应用

  6. pm uninstall packageName:卸载应用

  7. pm clear:清除应用数据

  8. pm set-install-locationpm get-install-location:设置/获取应用安装位置

  9. am start:启动一个Activity

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 打开相机
    adb shell am start -n com.android.camera/.Camera
    # 先停止再启动
    adb shell am start -S com.android.camera/.Camera
    # 等待应用完成启动
    adb shell am start -W com.android.camera/.Camera
    # 用默认浏览器打开网页
    adb shell am start -a android.intent.action.VIEW -d http://testerhome.com
    # 启动拨号器拨打10086
    adb shell am start -a android.intent.action.CALL -d tel:10086
  10. am instrument:启动instrumentation

  11. am monitor: 监控crash与ANR

  12. am force-stop: 后跟包名,结束应用

  13. am startservice:启动一个服务

  14. am broadcast: 发送一个广播

    向设备发送按键事件

  15. input text:发送文本,非中文

    1
    adb shell input text test123456
  16. input keyevent:发送按键事件

    1
    2
    # 按下home键
    adb shell input keyevent KEYCODE_HOME
  17. inout tap:发送触摸事件

    1
    2
    # 点击坐标为500 500的位置
    adb shell input tap 500 500
  18. input swipe:滑动事件

    1
    2
    3
    4
    # 从右边向左滑动
    adb shell input swipe 900 500 100 500
    # 模拟长按(小距离内较长时间滑动)
    adb shell input swipe 500 500 501 501 2000

    screencap截图

  19. screencap -p: 截屏保存

    1
    adb shell screencap -p /sdcard/screen.png
  20. screenrecord:录制

    1
    2
    # 录制视频,ctrl + c 结束录制
    adb shell screenrecord sdcard/record.mp4

    获取当前界面的控件信息

  21. adb shell uiautomator dump:获取控件信息

    1
    2
    3
    # 不加 [file] 选项时,默认存放在 sdcard 下
    [xuxu:~]$ adb shell uiautomator dump
    UI hierchary dumped to: /storage/emulated/legacy/window_dump.xml

    输入法ime

  22. adb shell ime list -s:列出输入法

  23. adb shell ime set com.baidu.input_mi/.ImeService:选则输入法

分辨率wm

  1. adb shell wm size: 获取屏幕分辨率

测试

  1. monkey:随机发送输入事件,用于测试
    1
    2
    3
    4
    # 保存信息到d盘 monkey.log
    adb shell monkey -p com.android.settings 5000 > d:\monkey.log
    # 保存信息到手机的目录(加引号)
    adb shell "monkey -p com.android.settings 5000 > sdcard/monkey.log"

系统

  1. settings:设置系统参数
  2. dumpsys:服务信息
  3. log:在logcat中打印指定信息
    1
    2
    # -p:优先级,-t:tag,标签,后面加上 message
    adb shell log -p d -t xuxu "test adb shell log"
  4. getprop:查看系统参数
    1
    adb shell getprop ro.build.version.sdk

其它

还支持linux的命令