springboot(4)

个人积累,请勿私自转载,转载前请联系
代码及文章资源https://github.com/jedyang/DayDayUp/tree/master/java/springboot
基于SpringBootCookBook的读书笔记,重在个人理解和实践,而非翻译。
web框架配置 配置URL匹配
简单来说,springboot允许我们定制自己的url匹配规则。
比如,我们想使用isbn.revision做匹配,但是默认的情况下,.是界定符。
做法
  1. 先看下现在的效果
    http://localhost:8080/books/1001.1
    {"id":1,"isbn":"1001","title":"test1","description":null,"author":{"id":1,"firstName":"yunsheng","lastName":"yang"},"publisher":{"id":1,"name":"yunsheng"},"reviewers":[]}
    因为.被做了处理,所以1001.1会被查询来,但实际并不存在。
  2. 配置URL匹配
    在WebConfiguration中进行配置
    // 演示URL匹配 @Override public void configurePathMatch(PathMatchConfigurer configurer) { configurer.setUseSuffixPatternMatch(false). setUseTrailingSlashMatch(true); }

  3. run
    http://localhost:8080/books/1001.1
    现在就查不到了。
原理
  • setUseSuffixPatternMatch(false)表明不使用.*匹配。
    区别就是@RequestMapping(value = "https://www.it610.com/{isbn}", method = RequestMethod.GET)中isbn的值。
    false,isbn值是1001.1。
    true,isbn值是1001。
  • setUseTrailingSlashMatch(true)表明使用/做分割符,就像不存在一样,不会加到参数里。
在极端特殊情况下,也可以使用PathMatcher 和 UrlPathHelper做特殊定制化。
配置静态资源路径匹配
上一小节,我们配置了controller方法的路径匹配。也可以配置对静态资源的访问路径。
比如,我们要通过http://localhost:8080/internal/application.properties对外暴露我们的application.properties配置文件。
做法
  1. 在WebConfiguration中添加配置
    // 访问静态资源 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/internal/**") .addResourceLocations("classpath:/"); }

  2. run
    访问http://localhost:8080/internal/application.properties会根据你浏览器的设置,下载或直接展示。
原理
  • addResourceHandler("/internal/**")添加一个处理匹配/internal/**路径的handler,可以多个
  • addResourceLocations("classpath:/")表明资源从哪里找,可以多个。如果多个,顺序按照添加的顺序查找。
通过EmbeddedServletContainerCustomizer定制tomcat
我们可以在application.properties中配置很多东西,如port、ssl等。但是springboot也通过通过EmbeddedServletContainerCustomizer开放给我们更复杂的程序化配置能力。
比如通过代码配置session的超时时间。(当然这个也可以通过配置文件配置)
做法
  1. 在WebConfiguration中添加配置
    @Bean public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer() { return new EmbeddedServletContainerCustomizer() { @Override public void customize(ConfigurableEmbeddedServletContainer container) { container.setSessionTimeout(1, TimeUnit.MINUTES); } }; }

  2. 在controller中加一个处理方法
    // 演示配置 @RequestMapping(value = "https://www.it610.com/session", method = RequestMethod.GET) public String getSessionId(HttpServletRequest request) { return request.getSession().getId(); }

查一下session id
  1. run
    http://localhost:8080/books/session
    一分钟后再试,可以看到session id改变
原理 在应用启动时,springboot会自动发现Customizer实例,并执行其customize方法。将其引用传给servlet容器。 这个Customizer实例有我们对容器的配置。
像EmbeddedServletContainerCustomizer这种只有一个方法的接口,对java8 的lamda表达式是非常使用的。所以可以改写成
@Bean public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer() { return (ConfigurableEmbeddedServletContainer container) -> { container.setSessionTimeout(1, TimeUnit.MINUTES); }; }

选择内嵌的servlet容器
tomcat是springboot默认的servlet容器,但是我们也可以选择其他的容器,例如jetty。
做法
  1. 排除tomcat的依赖,增加jetty依赖
    org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-tomcat org.springframework.boot spring-boot-starter-jetty

  2. 会发现有代码报错。因为RemoteIpFilter是tomcat的包里的。将其注释掉。
  3. run
    2017-09-06 15:47:25.468INFO 8580 --- [main] org.eclipse.jetty.server.Server: jetty-9.4.5.v20170502

测试一切正常。
配置连接支持https
关于htts这块,原文档已经过时,下面是自己摸索的。
做法
  1. 为了使用https。首先需要创建一个keysotre。用来加解密同浏览器的SSL通信。
    keytool是jdk的工具。我是jdk8,命令如下:
    keytool -genkeypair -alias tomcat -keyalg RSA
springboot(4)
文章图片
rsa.png 成功之后,在用户目录下会创建.keystore文件。
  1. 修改配置文件application.properties
    server.port = 8443 server.ssl.key-store = ${user.home}/.keystore server.ssl.key-store-password = 123456 server.ssl.key-password = 123456

密码改成你自己的。。
  1. run
    这样就需要使用https访问8443端口了
springboot(4)
文章图片
https.png 配置连接同时支持http和https
企业应用中经常有这种场景,需要同时开两个端口,分别支持http和https。
但是上面的方法只能使用一个。不可同时配置,如果两个都启动,至少有一个要以编程的方式配置。Spring Boot官方文档建议在application.properties中配置HTTPS,因为HTTPS比HTTP更复杂一些。
继续上面操作。
做法
  1. 用代码给tomcat配置上一个http连接器
    @Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory(); tomcat.addAdditionalTomcatConnectors(createStandardConnector()); return tomcat; } private Connector createStandardConnector() { Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setPort(8080); return connector; }

我是放在WebConfiguration中,其实并不是一定要放在这。只要启动时加载就行。
  1. run
    可以看到http也可以了。
springboot(4)
文章图片
http.png 【springboot(4)】综合起来看比原文简单的多。
唉,springbootcookbook现在看有些过时了,还是坚持看完吧,开卷有益,遇坑填坑吧。

    推荐阅读