核心术语

Persistence Contexts

Persistence Unit 是实体类的一个命名配置。Persistence Context是托管的实体实例的集合。 每个Persistence Context关联一个Persistence Unit,限制了托管的实例的类在Persistence Unit所定义的类的集合范围内。一个实体实例被托管的意思是说,它被包含在一个Persistence Context中并且能够通过Entity Manager来操纵它。 因此,我们说Entity Manager管理一个Persistence Context。

如果一个Persistence Context参与到事务中,那么托管的实体的在内存中的状态将会同步到数据库。

阅读更多

Android使用HTTPS通信首先需要告诉底层的HTTP客户端,对应https的Schema,使用什么端口,进行SSLSocket的通信。

这里以Httpclient为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SSLSocketFactory sf = new SSLSocketFactory();
sf.setHostnameVerifier(SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", sf, 443));
ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);
return new DefaultHttpClient(ccm, params);

阅读更多

HTTPS是在基于TLS/SSL的安全套接字上的的应用层协议,除了传输层进行了加密外,其它与常规HTTP协议基本保持一致。

SSL通信原理

当你的浏览器向服务器请求一个安全的网页(通常是 https://)

阅读更多

Spring Boot的应用是可以通过main方法中运行SpringApplication.run()来启动的。如果项目使用了gradle或者maven,则可以通过gradle bootRun或者mvn spring-boot:run等插件来运行。

但是运行起来是有不同的,因为通过gradle或者maven运行,他们运行起来之后能够正确的处理一些runtime和provided的依赖,但是通过main方法运行的cp则是IDE中固定的。

阅读更多

Forward Headers

应用有时候需要发送302重定向或者渲染指向自身的绝对链接。当应用运行在一个反向代理的后端,调用者想要获得的是指向代理的地址,而不是后面主机的物理地址。 通常这个这种情况,代理会通过添加HTTP头来告诉后端应用如何构建指向自己的链接。

如果代理添加了通常约定的X-Forwarded-ForX-Forwarded-Proto, 设置server.use-forward-headerstrue, 就能生成正确的链接。

阅读更多

Thymeleaf的双大括号语法,会调用Conversion Service来进行任何对象到String的转换。

  • For variable expressions: ${{…}}
  • For selection expressions: *{{..}}

这对大多数的属性标签都是有用的,但是th:field是个例外。

应用中可能设计很多不同格式的时间、数字的转换和显示。可以通过基于Annotation-driven Formatting来实现。 使用@NumberFormat来格式化java.lang.Number字段,使用@DateTimeFormat来格式化java.util.Date, java.util.Calendar, java.util.Long, 或者Joda Time字段。

AnnotationFormatterFactory

为了使用注解格式化,需要注册AnnotationFormatterFactory的实例,下面是个例子

阅读更多

在Spring 3.1之前,注册一个配置文件的唯一方法就是

1
<context:property-placeholder location="some.properties"/>

Spring 3.1引入了PropertySourceEnvironment接口,可以通过@PropertySource注解来注册

1
2
3
@Configuration
@PropertySource("classpath:some.properties")
public class ApplicationConfiguration

并且从Spring 3.1之后,<context:property-placeholder>实际底层注册的是PropertySourcesPlaceholderConfigurer对象。 这个对象具有更好的扩展性并且和EnvironmentPropertySource接口交互。

阅读更多

Spring MVC的异常处理

HandlerExceptionResolver的实现用来处理意外的异常。

ExceptionHandlerExceptionResolver

ExceptionHandlerExceptionResolver实现通常寻找@ExceptionHandler注解的方法来处理异常。

1
2
3
4
5
6
7
8
9
10
11
12
@Controller
public class SimpleController {
// @RequestMapping methods omitted ...
@ExceptionHandler(IOException.class)
public ResponseEntity<String> handleIOException(IOException ex) {
// prepare responseEntity
return responseEntity;
}
}

阅读更多

Spring Security可以保护应用免收Cross Site Request Forgery (CSRF)的攻击。

什么是CSRF

假设你的银行网站提供如下的表单进行转账

1
2
3
4
5
6
POST /transfer HTTP/1.1
Host: bank.example.com
Cookie: JSESSIONID=randomid; Domain=bank.example.com; Secure; HttpOnly
Content-Type: application/x-www-form-urlencoded
amount=100.00&routingNumber=1234&account=9876

阅读更多

Fork me on GitHub