Spring Boot支持Jetty服务器,支持http、https(ssl、tls)双协议,支持双端口
2017-08-11 16:59
836 查看
1:Spring boot 项目默认的web服务器为tomcat,故排除tomcat依赖,加入jetty依赖,请看下图:
注:Spring boot版本:1.4.7.RELEASE Jetty:jetty-9.3.19.v20170502<!--最新版的1.5.6在jetty上不能相应文件上传,故未使用--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency>
2:Spring boot jetty支持http、https(ssl、tls)双协议,支持双端口配置
2.1:application.yml配置,配置http的协议端口为5205,配置https的证书文件路径、密码、端口(7205)server: # address: 192.168.1.119 #此处不需要配置ip,配置后则会使用hostname访问 port: 5205 context-path: /note5 jetty: selectors: -1 acceptors: -1 https: port: 7205 keystore-password: 123456 keystore-file: D:/rsakey/loveshare.keystore
2.2:配置参数绑定bean的属性HttpsProperties
package me.loveshare.note5.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; @Data @ConfigurationProperties(prefix = "https") public class HttpsProperties { private Integer port; private String keystoreFile; private String keystorePassword; }
2.3:注解该类HttpsConfiguration,配置Bean对象JettyEmbeddedServletContainerFactory,进行Jetty初始化
package me.loveshare.note5.configuration; import lombok.extern.slf4j.Slf4j; import me.loveshare.note5.properties.HttpsProperties; import org.eclipse.jetty.http.HttpScheme; import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.server.*; import org.eclipse.jetty.util.ssl.SslContextFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer; import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer; import org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainerFactory; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Slf4j @Configuration @EnableConfigurationProperties(HttpsProperties.class) public class HttpsConfiguration { @Autowired private HttpsProperties properties; @Value("${server.port}") private int httpPort; @Bean public EmbeddedServletContainerCustomizer servletContainerCustomizer() { return new EmbeddedServletContainerCustomizer() { @Override public void customize(ConfigurableEmbeddedServletContainer container) { if (container instanceof JettyEmbeddedServletContainerFactory) { customizeJetty((JettyEmbeddedServletContainerFactory) container); } } private void customizeJetty(JettyEmbeddedServletContainerFactory container) { container.addServerCustomizers((Server server) -> { // HTTP ServerConnector connector = new ServerConnector(server); connector.setPort(httpPort); // HTTPS SslContextFactory sslContextFactory = new SslContextFactory(); sslContextFactory.setKeyStorePath(properties.getKeystoreFile()); sslContextFactory.setKeyStorePassword(properties.getKeystorePassword()); HttpConfiguration config = new HttpConfiguration(); config.setSecureScheme(HttpScheme.HTTPS.asString()); config.addCustomizer(new SecureRequestCustomizer()); ServerConnector sslConnector = new ServerConnector( server, new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()), new HttpConnectionFactory(config)); sslConnector.setPort(properties.getPort()); server.setConnectors(new Connector[]{connector, sslConnector}); log.info("\n*** Jetty SSL setting successful." + properties.getPort()); }); } }; } }
3:协议测试
3.1:测试api接口配置package me.loveshare.note5.web.api; import lombok.extern.slf4j.Slf4j; import me.loveshare.note5.data.entity.bo.common.JsonResult; import me.loveshare.note5.data.entity.bo.common.JsonResultMethod; import me.loveshare.note5.data.util.DateUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.util.Date; @Slf4j @RestController public class TestDataApi extends BaseApi { /** * 协议测试 */ @RequestMapping(value = "test", produces = "application/json;charset=UTF-8", method = {RequestMethod.GET, RequestMethod.POST}) public JsonResult initDbDatasC() { return JsonResultMethod.code_200("The request completed successfully.", DateUtils.timestamp(new Date())); } }
3.2:请求参数监控:
package me.loveshare.note5.web.api; import lombok.extern.slf4j.Slf4j; import me.loveshare.note5.data.util.NetworkUtils; import me.loveshare.note5.data.util.StringUtils; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestHeader; import javax.servlet.http.HttpServletRequest; @Slf4j public class BaseApi { @ModelAttribute public void firstMC(HttpServletRequest request, @RequestHeader(value = "uAT", required = false) String uAT) { request.setAttribute("uAT", uAT); //此处可转换用户的id //打印请求日志 printAccess(request); } private final void printAccess(HttpServletRequest request) { StringBuilder su = new StringBuilder(); su.append("\nUser-Access-Args:").append("{"); su.append("\"protocol\":\"").append(request.getProtocol() + "(" + request.getScheme()).append(")\","); su.append("\"ip\":\"").append(NetworkUtils.getIpAddr(request)).append("\","); su.append("\"port\":\"").append(NetworkUtils.getPort(request)).append("\","); su.append("\"method\":\"").append(request.getMethod()).append("\","); su.append("\"url\":\"").append(NetworkUtils.getCurrentURL(request)).append("\","); su.append("\"user-agent\":\"").append(NetworkUtils.getUserAgent(request)).append("\","); su.append("\"uAT\":\"").append(request.getAttribute("uAT")).append("\"}"); log.info(su.toString()); } }
3.3:web请求地址和日志:
http://192.168.1.119:5205/note5/test.json https://192.168.1.119:7205/note5/test.json[/code]User-Access-Args:{"protocol":"HTTP/1.1(http)","ip":"192.168.1.119","port":"64894","method":"GET","url":"/note5/test.json","user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36","uAT":"null"} User-Access-Args:{"protocol":"HTTP/1.1(https)","ip":"192.168.1.119","port":"64910","method":"GET","url":"/note5/test.json","user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36","uAT":"null"}
GitHub全源代码https://github.com/loveshareme/spring-boot/tree/master/spring-boot-note5
相关文章推荐
- Spring Boot支持tomcat服务器,支持http、https(ssl、tls)双协议,支持双端口
- Spring Boot支持Undertow服务器,支持http、https(ssl、tls)双协议,支持双端口
- 让CentOS服务器支持https(安全http协议)
- 28. HTTP、SSL/TLS和HTTPS协议的区别与联系
- 让CentOS服务器支持https(安全http协议)
- HTTP & HTTPS网络协议重点总结(基于SSL/TLS的握手、TCP/IP协议基础、加密学)
- HTTPS协议--HTTPS权威指南:在服务器和Web应用上部署SSL/TLS和PKI (/book/1734)
- 服务器 配置SSL for nginx && springboot(jetty)
- HTTP协议的介绍,Web服务器配置,虚拟主机的配置,如何用SSL实现HTTPS。
- HTTP & HTTPS网络协议重点总结(基于SSL/TLS的握手、TCP/IP协议基础、加密学)
- 让CentOS服务器支持https(安全http协议)
- spring-boot实现访问http跳转到https端口的方法
- Spring Boot工程支持HTTP和HTTPS,HTTP重定向HTTPS
- 让CentOS服务器支持https(安全http协议)
- Http协议之Https&SSL/TLS&DNS
- springboot项目 同时支持http、https
- 使用ssl模块配置同时支持http和https并存
- Linux下SVN服务器同时支持Apache的http和https及svnserve独立服务器三种模式且使用相同的访问权限账号
- spring-boot 添加http自动转向https
- nginx搭建支持http和rtmp协议的流媒体服务器之一【转】