动态继承一个类/抽象类(不是接口),(动态实现接口参照https://gist.github.com/gexiangdong/f7536a8d86a631b1c391acf13d334a90 )
此实现需要cglib, pom中增加依赖
1 | <dependency> |
实现代码如下:
待创建的父类,可以是抽象类
1 | /** |
动态创建
1 | import net.sf.cglib.proxy.Enhancer; |
动态继承一个类/抽象类(不是接口),(动态实现接口参照https://gist.github.com/gexiangdong/f7536a8d86a631b1c391acf13d334a90 )
此实现需要cglib, pom中增加依赖
1 | <dependency> |
实现代码如下:
1 | /** |
1 | import net.sf.cglib.proxy.Enhancer; |
通过Proxy类动态实现一个接口 (只能是接口,可多个接口,如果需要动态创建抽象类的子类,可参照https://gist.github.com/gexiangdong/599b58566e349be40d99ee02877eb985 )
Raw
实现代码如下:
1 | /** |
也可以一次实现多个接口
1 | import java.lang.reflect.InvocationHandler; |
只查询标准的可执行路径内文件(默认只有 /usr/bin, /bin, /usr/sbin, /sbin 等四个目录)
使用方法: whereis filename
查询PATH环境变量中设置的所有目录。
使用方法: which filename
或 which -a filename
-a 参数表示查询并列出所有,不加此参数只列出第一个。
整个磁盘查询,但需要先建立索引数据库。 sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist
用来建索引
整个硬盘查询,速度慢。
使用方法: find / -name filename
1 | ls --full-time |
如果经常使用,也可以把TIME_STYLE设置到环境变量里,以后ls -l即可
1 | export TIME_STYLE='+%Y%m%d %H:%M:%S' |
1 | ls --sort=extension |
1 | ls -l |grep "^-"|wc -l |
1 | ls -l |grep "^d"|wc -l |
1 | ls -lR|grep "^-"|wc -l |
如统计/home/temp 目录(包含子目录)下的所有文件包含java的文件:
1 | ls -lR /home/temp | grep java | wc -l |
统计文件夹下目录的个数,包括子文件夹里的
1 | ls -lR | grep "^d" | wc -l |
1 | du -d 1 -h |
命令查看当前目录下所有文件夹的大小 -d 指深度,后面加一个数值,表示统计到几级子目录。
1 | touch -mt YYYYMMDDhhmm filename |
1 | touch -t YYYYMMDDhhmm filename |
微信小程序获得iv, sessionkey 后传递给后端API,然后解密用户信息等敏感信息,有时解密时报错,说iv只有15个byte的问题(应该是16个)。
这是由于小程序段获得的iv是base64 encode之后的,其中可能含有“+”,+通过url参数直接传递,到服务端后,会被当作空格,空格base64.decode后会少一位,变成了15位。
要得到正确的iv,需要小程序传递前先转义,再传递才行。
1 | url = "xxx?iv=" + encodeURIComponent(iv) |
encryptedData也需要类似的处理。
这样才不会被认作空格,认作空格后,base64.decode会少一位。
默认java8(或更低版本)不能处理tiff图片,例如
1 | BufferedImage bufferedImage = ImageIO.read(new File("desk.tif")); |
上面的代码得到的 bufferedImage 变量是null值
在maven的依赖里增加一个imageio-tiff就会解决这个问题。
1 | <dependency> |
此依赖的详细信息可参考如下网址:
https://github.com/haraldk/TwelveMonkeys
Java 9开始jdk已经支持TIFF,不用再额外增加依赖。
在 spring-boot 项目中, slf4j和logback被自动引入,只需要配置logback即可使用,当不是spring-boot项目时,需要我们手工做点事才能使用。 (Spring Boot项目中配置logback, 请参考这里)
1 | <dependency> |
这一个依赖就够了,它会自动帮我们增加另外两个依赖: logback-core 和 slf4j-api
这和spring-boot中项目中区别不大,文件名从logback-spring.xml被改成了 logback.xml,还是放置到 src/main/resources 目录下,里面不再设置spring的profile了。
1 | <?xml version="1.0" encoding="UTF-8"?> |
可以通过CompletableFuture 来执行某个任务,超时后放弃任务。
1 | import java.util.concurrent.CompletableFuture; |
使用 SpringMVC + Spring Security 做的网页,前端嵌套在 iframe/frame 中内容不显示,一片空白。
打开浏览器的网页检查器,会在主控台发现错误信息:
Refused to display ‘http://x.x.x.x/xx/’ in a frame because it set ‘X-Frame-Options’ to ‘DENY’.
查看 Response Header 会发现 spring security 加了一个header
X-Frame-Options: Deny
通过在 Spring Security 中设置httpSecurity.headers().frameOptions().disable()
禁止调这个头信息即可。
使用正则表达式,从markdown文件中提取链接显示的字符和链接到的地址。
1 | String content = "这是段.md文件的内容。其中[这是一个链接](./html/README.md),还有其他内容,这里又有一个[another link](another.md),这次链接到了another.md。"; |
运行结果:
1 | [这是一个链接](./html/README.md) |
使用NGINX做双向认证的网站,访问时需要客户端安装有证书才可继续访问。可用于仅限特定用户群的网站,例如企业内部的业务管理系统,可提高系统安全性,阻止未授权用户访问。
在下述方法中,客户端证书采用自制(可节约成本),服务器端证书可自制也可购买,两者不必同一个CA,建议购买(有免费的域名证书)因为自制的浏览器会出现不信任标志。
自制证书使用openssl工具,使用前需要先安装.
1 | #制作CA私钥 |
如果使用购买的服务器证书,可忽略此部分
1 | #制作服务器端私钥: |
1 | #制作客户端私钥 |
生成CSR环节会要求输入一些信息,如下:
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:SH
Locality Name (eg, city) []:SH
Organization Name (eg, company) [Internet Widgits Pty Ltd]:公司名(英文字母)
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:这里要输入你的主机名域名
Email Address []:someone@yourcompany.com
下面这段需要输入的两项保留为空(直接按回车)即可。
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
1 | server { |
NGINX会把客户端证书做成内置变量,可通过proxy_set_header传递给应用,在应用内获取request header即可得到证书对应的信息。
1 | location /webapp { |
除了 $ssl_client_s_dn 外,NGINX还提供很多内置变量对应证书的其他部分内容,想起请参考 nginx的ngx_http_ssl_module 模块文档。使用时需要注意nginx版本是否支持对应的变量。