使用正则表达式,从markdown文件中提取链接显示的字符和链接到的地址。
1 | String content = "这是段.md文件的内容。其中[这是一个链接](./html/README.md),还有其他内容,这里又有一个[another link](another.md),这次链接到了another.md。"; |
运行结果:
1 | [这是一个链接](./html/README.md) |
使用正则表达式,从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版本是否支持对应的变量。
websocket协议的握手过程。
首先客户端和服务器端建立的是http 1.1的连接,客户端发送请求,请求的资源地址是websocket的地址,但在连接中增加几个请求头:
Connection: upgrade
Upgrade: Websocket
Sec-WebSocket-Key: base64格式的随机数
Sec-Websocket-Version: 13 (13是版本号)
服务器收到这种连接后,如果支持升级到websocket,会发出类似如下的回应:
HTTP/1.1 101 Switching Protocols
Server: Apache-Coyote/1.1
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Accept: OfS0wDaT5NoxF2gqm7Zj2YtetzM=
Date: Tue, 04 Sep 2018 05:46:48 GMT
之后websocket连接就建好了,双方可以通讯了,下面有段建立连接的代码,可以参考。解析websocket帧部分没有写,只是当成字符串打印出来了,因为帧中包含一些二进制的控制信息,所以打印内容会有乱码(即使消息是纯文本也有乱码,因为有部分帧的头部信息也被当成字符串打印了)
1 | import java.net.*; |
通过maven可以把依赖的各种jar和自己的程序都打包成一个jar,这样在部署的时候就非常方便了,这点在做可执行的jar包时就更方便了。
这依赖一个maven的插件:shade
在pom里配置shade插件即可:
1 | <build> |
使用 mvn package 打包时,就可以把所有依赖的jar都打包到一个jar里了。要运行只需要 java -jar xxx.jar 不用在classpath参数里写一大堆jar了,是不是很方便?
shade插件还可以配置排除/包含某些jar包。
不用spring,仅仅jms和activeMQ
1 | <?xml version="1.0" encoding="UTF-8"?> |
1 | package cn.devmgr.activemqlistener; |
1 | package cn.devmgr.activemqlistener; |
1 | <dependency> |
最好再建个子目录,这样资源更方便管理。
使用模板调格式会方便很多(宽度、字体、数字格式等等,节省代码,容易修改)
下面的例子是写在spring controller内的,如果不是controler,需要变化的只有只有最后返回的部分。
1 | @ResponseBody |
改成继承org.springframework.boot.web.servlet.support.SpringBootServletInitializer, 例如:
1 | package cn.devmgr.tutorial; |
1 | <packaging>war</packaging> |
1 | <dependency> |
spring boot 2.0项目需要在tomcat 8.5以上版本环境下运行
| classpath:位置 | 项目中的目录 | 优先级 |
|---|---|---|
| /META-INF/resources/ | src/main/resources/META-INF/resources/ | 优先级最高 |
| /resources/ | src/main/resources/resources/ | 第二优先 |
| /static/ | src/main/resources/static/ | 第三优先 |
| /public/ | src/main/resources/public/ | 第四优先 |
如果项目中没有@EnableWebMvc注解,那么上述静态资源是可以直接被浏览器访问的,如果项目中有@EnableWEbMvc注解,则无法访问了。
这是因为SpringBoot默认启动了自动配置,自动配置配置上述静态资源的访问,而使用@EnableWebMvc注解后,会禁止掉org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration 的自动配置,于是这些不能被访问了。
如果需要@EnableWebMvc注解,又需要静态资源,增加一个自定义的配置:
1 | @Configuration |
logback是spring boot中的默认日志记录框架,spring推荐使用logback-spring.xml来做配置,loback-spring.xml可以放置到src\main\resources目录下。
通过在logback-spring.xml中配置不同的pfofile,可以实现不同的profile不同的日志记录方式,下面是一个例子。
1 | <?xml version="1.0" encoding="UTF-8"?> |
需要注意:有logback配置文件后,application.yml中的日志配置部分就失效了。
1 | location / { |
修改application.yml
1 | server: |
之后在程序中获取的IP (request.getRemoteAddr()) 就是真实的IP地址了。