2018-10-26 07:15:29

Spring MVC 5.X Debug

web.xml初始化         web.xml需要配置Spring的listener(ContextLoaderListener),ContextLoaderListener是Spring的初始化加载类,如果未在web.xml中配置“context-param”,默认会优先加载“/WEB-INF/”下加载applicationContext.xml。     SpringMVC实现方式是Servlet,通过在web.xml配置DispatcherServlet,所有的请求都会先经过Spring处理。     Spring MVC是一个架构上非常复杂的框架,经过抽象后的DispatcherServlet就会显得比较复杂了。但是从根本上来说DispatcherServlet就是一个普通的Servlet,所以它处理Http请求的方式就必然是重写Servlet的doXXX或service方法。      从类图可以看到,FrameworkServlet类是DispatcherServlet第一个父类,这个类也是重写了所有的Http请求方法(七种Http请求方式),以及Servlet提供的service方法:     在Servlet中,所有的请求方法都会先经过service方法,然后才会进入具体的doXXXX方法。 不过Spring MVC中并没有直接在service方法中处理请求的

2018-10-17 08:48:45

修改Spring Data Elasticsearch 对象序列化方式

Spring Data Elasticsearch默认采用了Jackson作为对象序列化方式,但是为了保持Json序列化一致性就不得不修改Spring Data Elasticsearch的序列化结果了,这里讲下如何使用的是Fastjson来序列化Spring Data Elasticsearch查询出来的数据。 Spring Data Elasticsearch中,默认会调用org.springframework.data.elasticsearch.core.DefaultResultMapper来映射ElasticSearch返回的结果,而最终序列化方法在DefaultResultMapper的父类org.springframework.data.elasticsearch.core.AbstractResultMapper的publicT mapEntity(String source, Classclazz)方法,所以只需要想办法重写mapEntity方法就行了。 在Spring Boot项目中定义下自定义的ElasticsearchTemplate就可以实现自定义ResultMapper了: @Bean("elasticsearchTemplate") public ElasticsearchTemplate elasticsearchTempla

2018-08-03 09:47:51

Spring MVC MultipartResolver特性-QP编码

今天看Spring的Multipart处理发现一段比较奇怪的代码: 奇怪的是Spring为什么会对“=?”、“?=”进行特殊处理?跟进后发现这玩意是QP编码,用来解决邮件内附件编码问题。Spring调用了java mail的api对文件上传的附件文件名称进行了QP编码。 既然已知Spring的这个特性,那么某些时候或许就可以通过对文件名称进行编码来绕过传统的waf、cdn的防御了。 利用Java mail库生成特殊的文件名: 上传进行编码后的文件: Spring会做decode解析:

2014-04-16 16:37:49

Spring 多数据源配置

DatabaseContextHolder.java public class DatabaseContextHolder { private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); public static void setCustomerType(String customerType) { contextHolder.set(customerType); } public static String getCustomerType() { return contextHolder.get(); } public static void clearCustomerType() { contextHolder.remove(); } } DataSourceInterceptor.java import org.aspectj.lang.JoinPoint; import org.springframework.stereotype.Component; @Component public class DataSourceInterceptor { public void setdataSourceOne(JoinP

2013-12-19 12:16:59