Remember-Me接口和实现

1
2
3
4
5
6
Authentication autoLogin(HttpServletRequest request, HttpServletResponse response);
void loginFail(HttpServletRequest request, HttpServletResponse response);
void loginSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication successfulAuthentication);

阅读更多

基于源码的流程分析

下面的源码基于Spring Security 4.0.3版本。

入口 WebSecurityConfiguration

WebSecurityConfiguration的目的是配置WebSecurity来创建[FilterChainProxy][FilterChainProxy]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Autowired(required = false)
public void setFilterChainProxySecurityConfigurer(
ObjectPostProcessor<Object> objectPostProcessor,
@Value("#{@autowiredWebSecurityConfigurersIgnoreParents.getWebSecurityConfigurers()}") List<SecurityConfigurer<Filter, WebSecurity>> webSecurityConfigurers)
throws Exception {
webSecurity = objectPostProcessor
.postProcess(new WebSecurity(objectPostProcessor));
if (debugEnabled != null) {
webSecurity.debug(debugEnabled);
}
Collections.sort(webSecurityConfigurers, AnnotationAwareOrderComparator.INSTANCE);
Integer previousOrder = null;
for (SecurityConfigurer<Filter, WebSecurity> config : webSecurityConfigurers) {
Integer order = AnnotationAwareOrderComparator.lookupOrder(config);
if (previousOrder != null && previousOrder.equals(order)) {
throw new IllegalStateException(
"@Order on WebSecurityConfigurers must be unique. Order of "
+ order + " was already used, so it cannot be used on "
+ config + " too.");
}
previousOrder = order;
}
for (SecurityConfigurer<Filter, WebSecurity> webSecurityConfigurer : webSecurityConfigurers) {
webSecurity.apply(webSecurityConfigurer);
}
this.webSecurityConfigurers = webSecurityConfigurers;
}

阅读更多

问题

系统长时间运行,但是没有人使用后,再次使用时会无法连接上数据库,会报类似这样的错误

org.hibernate.util.JDBCExceptionReporter: The last packet successfully received from the server was 56697 seconds ago. The last packet sent successfully to the server was 56697 seconds ago, which is longer than the server configured value of ‘wait_timeout’. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property ‘autoReconnect=true’ to avoid this problem.

阅读更多

Java相对于其他的一些开发语言来说,修改代码后经常需要重新编译代码,重启服务器等等,这些动作非常的耗时间,降低了不少生产效率,所以热部署一直是Java的开发人员所追求的。从JRebel到Spring Loader,它们都可以达到JVM的Hot Swapping的目的。但是针对类似Spring这样需要在服务器启动时初始化一些容器配置的项目,还是不得不把大量的时间花在重启服务器上。

阅读更多

Work Flow

Git Flow

主要分支

核心库应该有两个无限生命周期的分支:

  • master
  • develop

main-branches

我们把origin/master分支作为production主分支,它的HEAD版本的代码总是处于随时可以release的状态。

我们把origin/develop分支作为develop主分支,它的HEAD版本的代码总是处于最新的交付的开发状态。有时候也称之为集成分支。这也分支也是构建每日的晚间快照版本的来源。

develop分支的源码达到一个稳定的状态并且准备release的时候,所有的修改应该合并回master分支,然后做一个release序号的标记(tag)。

所以,当每次修改合并回master的时候,就是一个新的production release版本。所以理论上,我们可以使用一个Git钩子脚本来进行自动构建然后发布到我们的生产环境。

阅读更多

性能测试指南

概念

性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可以结合进行。

  • 负载测试是模拟实际软件系统所承受的负载条件的系统负荷,通过不断加载(如逐渐增加模拟用户的数量)或其它加载方式来观察不同负载下系统的响应时间和数据吞吐量、系统占用的资源(如CPU、内存)等,以检验系统的行为和特性,以发现系统可能存在的性能瓶颈、内存泄漏、不能实时同步等问题。负载测试更多地体现了一种方法或一种技术。
  • 压力测试是在强负载(大数据量、大量并发用户等)下的测试,查看应用系统在峰值使用情况下操作行为,从而有效地发现系统的某项功能隐患、系统是否具有良好的容错能力和可恢复能力。压力测试分为高负载下的长时间(如24小时以上)的稳定性压力测试和极限负载情况下导致系统崩溃的破坏性压力测试。

阅读更多

Docker CI

构建私有 Docker Registry

启动 registry

1
docker run -d -p 5000:5000 --name registry registry:2

Insecure Registry

当尝试从配有配置TLS的Registry会报如下错

1
FATA[0000] Error response from daemon: v1 ping attempt failed with error: Get https://121.42.160.161:5000/v1/_ping: tls: oversized record received with length 20527. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry 121.42.160.161:5000` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/121.42.160.161:5000/ca.crt

阅读更多

敏捷的Web框架,应该至少做到开箱即用,开发时不依赖任何外部数据库和外部的服务器是最理想的。

Web框架

Spring Boot基于Spring平台,涉及到了构建一个Java Web项目的大部分方面,是一个非常好的选择。只要简单的声明依赖,便可支持基于Spring各种特性。Web层基于Spring MVC,持久层支持JPA,Spring Data JPA,View层支持Freemarker等模板语言,支持Message、Application properties,支持日志,支持多个环境的Profile,安全方面支持Spring Security等等。Spring Boot把Spring的各个项目无缝的结合在一起,可以统一的使用Application properties对它们进行配置。

阅读更多

Fork me on GitHub