您的位置:首页 > 理论基础 > 计算机网络

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: