最近换了一只新的笔,感应充电的,价格极低,不得不感慨一下技术进步




…
Spring Security会默认配置若干个相关的HeaderWriter,比如HstsHeaderWriter、XXssProtectionHeaderWriter等。
默认情况下响应的头部类似这样
Cache-Control: no-cache, no-store, max-age=0, must-revalidate Pragma: no-cache Expires: 0 X-Content-Type-Options: nosniff Strict-Transport-Security: max-age=31536000 ; includeSubDomains X-Frame-Options: DENY X-XSS-Protection: 1; mode=block
这其中有五个HeaderWrite,撇开第一个Cache Control不谈,因为主要是涉及旧版本迁移,剩下了四个。
这个选项是由于浏览器对于资源会去“猜”。如果返回的资源没有指明类型,那么浏览器就会自己去判断。自动去判断内容是危险,可以构造出XSS攻击。
X-Content-Type-Options: nosniff
当然开启这一特性那么就必须在返回的资源中指明类型,不然会出现无法正确解析的情况。
一些网站自身就可以同时通过http和https访问,而有些只允许https访问,设置对应的头
Strict-Transport-Security: max-age=31536000 ;…
一个Java Web项目或多或少需要是一些javascript或者css依赖,比较容易想到的办法就是用前端构建工具管理依赖,然后直接拷贝到Webapp目录,当然spring boot对于静态资源还支持一下几个位置:
"classpath:/META-INF/resources/" "classpath:/resources/" "classpath:/static/" "classpath:/public/"
我对于前端管理工具并不喜欢,也不想安装诸如node等相关环境,这个时候就可以试用WebJars了。
WebJars将前端资源打包到jar中,这样开发人员就可以简单的管理依赖,并且可以使用已有的JVM base构建工具和生态链,同时对于RequireJS也有一些自动化支持。
在Spring Boot中使用WebJars是非常简单的,简单的引入依赖就可以,所有资源都暴露在 /webjars/** 下,只要你知道版本号和文件名,就可以直接在前端页面中引用相关资源。
在Spring Boot中使用WebJars如此简单,主要是因为Spring Boot有一个默认的支持,是否启动对应配置的条件在OnEnabledResourceChainCondition类
class OnEnabledResourceChainCondition extends SpringBootCondition {
public static final String WEBJAR_ASSERT_LOCATOR = "org.webjars.WebJarAssetLocator";
@Override
public ConditionOutcome getMatchOutcome(ConditionContext context,
AnnotatedTypeMetadata metadata) {
…迁移到Docker以后遇到的一个问题就是监控上的,比如当前资源消耗如何等等。
之前的监控是用的OneAPM,但是都是应用级别的,需要不同的应用安装不同的探针。
虽然也有很多可以监控Docker容器的,但是要在服务器安装服务我确实又不太想,找了一下发现OneAPM支持Docker化安装探针。
对应镜像的构建脚本可以看这里,官方的老是启动不起来,我就自己构建了一个。
在DaoCloud直接部署
然后就直接去OneAPM控制台看结果了

可以很容易看到每个container的内容消耗,也可以自己定义仪表盘。…
结合DaoCloud体验了几天Docker,感觉非常的不错,所以也准备把已有的一个项目也迁移到Docker上。
这个项目是一个Java的Web项目,需要Java8环境,使用了Spring Boot,自带了运行容器,可以直接 java -jar 启动。项目使用了MySql数据库,没有用什么专有特性。数据库中数据也不多,可以mysqldump来迁移。
先从数据库开始吧,原有数据库监听于3306端口,和应用一个主机。第一步打算就是先docker化数据库,但是仍然绑定端口在3306上,这样可以在只迁移数据库的情况下依然保证整个应用可用。
先去Daocloud的应用编排里面创建一个新的应用
db: image: mariadb restart: always ports: - 3306:3306 volumes: - /alidata/data/acgmo-data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=你的密码
然后直接连接到这个数据库
mysql -u root -p 数据库名 < bak.sql
完成后直接重启java web应用,看看应用是不是一切正常。
这个就稍微复杂一些了,因为mysql啥的中央库都有,不需要自己构建。但是这个就必须自己构建了。
DaoCloud提供了代码构建功能,也支持bitbucket的私有库,唯一需要做的就是添加一个Dockerfile来构建,当然如果不想添加到代码库中也可以使用云Dockerfile功能。
比如这个项目的Dockerfile如下
FROM…

一直使用Java生态圈,自己的机器,服务器上都是java环境,也没有用过太多php的东西。
想迁移博客到wordpress上觉得网上教程那么多,总有办法的,结果一下子就折腾了很多天。
服务器原来是有nginx和mysql的,但是都不是用apt-get安装的,是阿里云镜像市场找的,所以启动目录,配置位置都不一下。本来想试试nginx+php的,但是网上教程很多,操作每一步也是一样的,但是就是没有效果,连个php helloworld都没有。再 尝试了apache+php,很顺利,因为都是可以apt-get安装的,但是装好了wordpress提示没有mysql的支持。本来简简单单一个
apt-get install php5-mysql
就可以搞定,但是它依赖了mysql-common,这样原来的mysql就坏掉了。还好有阿里云快照,尝试手动安装,但是很不顺利,索性准备用docker。
Docker之前用过,但是主要是有很多免费的docker container,基本是为了当临时免费主机使用。要我完全用Docker搭建wordpress还是有困难的,命令行也不顺,操作和日志都是问题。
DaoCloud之前用过免费加速,这次就装上了集群管理,安装步骤很简单

安装好以后直接用应用编排功能
wordpress: image: wordpress restart: always links: - db:mysql ports: - 127.0.0.1:8020:80 volumes: - /alidata/data/blog-www:/var/www/html db: image: mariadb restart: always volumes: - /alidata/data/blog-data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=密码随意
创建以后自动启动…
之前一直使用的hexo,静态博客生成系统,对于服务器要求低,用markdown书写。
但随着自己使用阿里云服务器开始,hexo的优势就越发削弱。服务器可以自己控制,环境自然不是问题,反过来客户端的种种环境需要限制了书写的便利性。
前思后想,还是将博客迁到wordpress上,万幸的是hexo的文章地址和wordpress基本一样,也就省去了很多流量损失。加上wordpress的搜索引擎友好性不错,有ping功能和搜索引擎的各种插件,基本不太担心这块。
谈到迁移,hexo是可以导出rss的,但是这个是atom那种,wordpress导入识别不了,找了一个atom专用的导入插件,但是导入的格式太诡异,特别是代码那块问题太多,索性干脆自己抓取原博客,通过rest api导入。
wordpress需要安装两个插件wp rest api和json basic auth。后者可以直接用用户名密码认证,我直接在本地搭建一个wordpress先迁移好,再导出wordpress格式导入线上环境,确认无误之后再修改nginx反向代理的指向。之前用hexo是静态托管,现在改成反向代理。
wordpress有很多周边生态,比如我现在使用的手机客户端,随时都能码字。…

Maven是一个常用的构建工具,但是Maven的版本和插件的配合并不是那么完美,有时候你不得不切换到一个稍微旧一些的版本,以保证所有东西正常工作。
而Gradle提供了一个Wrapper,可以很好解决版本切换的问题,当然更重要的是不需要预安装Gradle。
Maven虽然没有官方的Wrapper,但是有一个第三方的Wrapper可以使用。
安装很简单mvn -N io.takari:maven:wrapper,安装完成如下

使用的时候直接./mvnw clean install即可,它会自动下载最新版本来执行。

如果需要指定版本,重新生成mvnw文件在运行即可
mvn -N io.takari:maven:wrapper -Dmaven=3.1.0
./mvnw clean install
…
有一个小项目代码托管在git@osc上,因为oschina支持免费的私有库,代码就放在上面了。
因为毕竟是实验性的东西,部署比较频繁,就写了一小段shell去做部署,也就是每次需要部署的时候登陆到主机执行这段shell即可。
后面看到了deploybot,感觉挺有意思的,但是最后的部署需要登录到主机上,总感觉不安全。
git@osc的WebHook是可以配置密码的,所以安全性还可以。
因为很简单的功能,监听一个端口,获取到post到的数据,然后判断密码,在判断commit信息,如果包含[deploy]就调用部署脚本。
图方便直接使用nodejs来写,虽然对nodejs很不熟,但是毕竟快。用到的库是express,日志用的log4js。
var express=require('express');
var app= express();
var bodyParser=require('body-parser');
var spawn=require('child_process').spawn;
var log4js=require('log4js');
log4js.configure({
appenders:[
{type:'console' },
{type:'file', filename:'logs.log' }
]
});
var logger = log4js.getLogger();
app.use(bodyParser.urlencoded({ extended:false }));

Github是一个汇聚了很多有趣东西的地方。如果你使用java作为主要开发语言,并配合gradle,maven等构建工具,那么项目的依赖大部分应该取自maven仓库。
但有些时候总有有些意外,有些项目的作者并没有将项目发布到maven中央仓库,有些分布在自己的一些第三方的仓库中。
没有发布的还好,自己寻找方案,如果发布到第三方仓库的,很有可能出现一些问题。
一直正常运行的项目突然CI挂了,去看看结果发现对方的第三方库挂了,而且这个依赖还是一个snapshot的依赖。
虽然在github上有源码,但是使用时我并不需要修改源码,所以并不希望直接使用源码级的依赖,采用jar的依赖是最好的。
无意之间发现了jitpack,解决了这个问题。
以这个项目为例modular ,项目基于maven,有pom.xml配置。
直接jitpack中填入这个地址,可以看到几个选项。

我需要最新版本,选择第一个,然后在gradle配置中添加
repositories {
maven {url"https://jitpack.io" }
}
dependencies {
compile'com.github.mountainblade:modular:4bf87e0a75'
}
一切就搞定了。
jitpack会自动打包并生成jar包,第一次请求会慢一些,后面就正常了。还可以查看打包的日志和项目文档。
比如https://jitpack.io/com/github/mountainblade/modular/4bf87e0a75/build.log.…