Jetty容器配置https
Configuring the Jetty Container as a Https Connector
Jetty版本:9.2.22.v20170606
Pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>learnJetty</groupId>
<artifactId>learnJetty</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.eclipse.jetty.aggregate</groupId>
<artifactId>jetty-all</artifactId>
<version>9.2.22.v20170606</version>
</dependency>
<!--生成json串-->
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-scala_2.10</artifactId>
<version>2.4.4</version>
</dependency>
</dependencies>
<build>
<finalName>JettyHttps</finalName>
<plugins>
<!--用来生成keystore-->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>keytool-maven-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<phase>generate-resources</phase>
<id>clean</id>
<goals>
<goal>clean</goal>
</goals>
</execution>
<execution>
<phase>generate-resources</phase>
<id>genkey</id>
<goals>
<goal>generateKeyPair</goal>
</goals>
</execution>
</executions>
<configuration>
<keystore>${project.build.directory}/jetty-ssl.keystore</keystore>
<dname>cn=127.0.0.1</dname><!-- put your CN here -->
<keypass>dypBdX1NB3gXA0DXCy9nfyJ4jqUDlaydgbo9OU12g</keypass>
<storepass>dypBdX1NB3gXA0DXCy9nfyJ4jqUDlaydgbo9OU12g</storepass>
<alias>jetty</alias>
<keyalg>RSA</keyalg>
</configuration>
</plugin>
</plugins>
</build>
</project>
说明:keytool-maven-plugin是用来生成jetty-ssl.keystore,默认生成在target目录下。
jetty-https.xml
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure id="Server" class="org.eclipse.jetty.server.Server">
<Call id="httpsConnector" name="addConnector">
<Arg>
<New class="org.eclipse.jetty.server.ServerConnector">
<Arg name="server"><Ref refid="Server" /></Arg>
<Arg name="factories">
<Array type="org.eclipse.jetty.server.ConnectionFactory">
<Item>
<New class="org.eclipse.jetty.server.SslConnectionFactory">
<Arg>
<New class="org.eclipse.jetty.util.ssl.SslContextFactory">
<Set name="KeyStorePath">\云化转型\myScalaTest3\jetty-ssl.keystore</Set>
<Set name="TrustStorePath">\云化转型\myScalaTest3\jetty-ssl.keystore</Set>
<Set name="KeyStorePassword"><Property name="jetty.keystore.password" default="dypBdX1NB3gXA0DXCy9nfyJ4jqUDlaydgbo9OU12g"/></Set>
<Set name="KeyManagerPassword"><Property name="jetty.keymanager.password" default="dypBdX1NB3gXA0DXCy9nfyJ4jqUDlaydgbo9OU12g"/></Set>
<Set name="TrustStorePassword"><Property name="jetty.truststore.password" default="dypBdX1NB3gXA0DXCy9nfyJ4jqUDlaydgbo9OU12g"/></Set>
<Set name="EndpointIdentificationAlgorithm"></Set>
<Set name="ExcludeCipherSuites">
<Array type="String">
<Item>SSL_RSA_WITH_DES_CBC_SHA</Item>
<Item>SSL_DHE_RSA_WITH_DES_CBC_SHA</Item>
<Item>SSL_DHE_DSS_WITH_DES_CBC_SHA</Item>
<Item>SSL_RSA_EXPORT_WITH_RC4_40_MD5</Item>
<Item>SSL_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
<Item>SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA</Item> <Item>SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA</Item>
</Array>
</Set>
</New>
</Arg>
<Arg name="next">HTTP/1.1</Arg>
</New>
</Item>
<Item>
<New class="org.eclipse.jetty.server.HttpConnectionFactory">
<Arg>
<New class="org.eclipse.jetty.server.HttpConfiguration">
<Set name="secureScheme"><Property name="jetty.httpConfig.secureScheme" default="https" /></Set>
<Set name="securePort"><Property name="jetty.httpConfig.securePort" deprecated="jetty.secure.port" default="61361" /></Set>
<Set name="outputBufferSize"><Property name="jetty.httpConfig.outputBufferSize" deprecated="jetty.output.buffer.size" default="32768" /></Set>
<Set name="outputAggregationSize"><Property name="jetty.httpConfig.outputAggregationSize" deprecated="jetty.output.aggregation.size" default="8192" /></Set>
<Set name="requestHeaderSize"><Property name="jetty.httpConfig.requestHeaderSize" deprecated="jetty.request.header.size" default="8192" /></Set>
<Set name="responseHeaderSize"><Property name="jetty.httpConfig.responseHeaderSize" deprecated="jetty.response.header.size" default="8192" /></Set>
<Set name="sendServerVersion"><Property name="jetty.httpConfig.sendServerVersion" deprecated="jetty.send.server.version" default="true" /></Set>
<Set name="sendDateHeader"><Property name="jetty.httpConfig.sendDateHeader" deprecated="jetty.send.date.header" default="false" /></Set>
<Set name="headerCacheSize"><Property name="jetty.httpConfig.headerCacheSize" default="512" /></Set>
<Set name="delayDispatchUntilContent"><Property name="jetty.httpConfig.delayDispatchUntilContent" deprecated="jetty.delayDispatchUntilContent" default="true"/></Set>
</New>
</Arg>
</New>
</Item>
</Array>
</Arg>
<Set name="host"><Property name="jetty.host" /></Set>
<Set name="port"><Property name="jetty.https.port" default="61361" /></Set>
<Set name="idleTimeout">60000</Set>
</New>
</Arg>
</Call>
</Configure>
说明:
1.里面set字段的值都可以修改。尤其要注意KeyStorePath和TrustStorePath的值,一定要确保jetty-ssl.keystore存在。
2.本教程中的jetty-https.xml默认放置在Maven工程目录下(与pom.xml同级)。
3.jetty-https.xml也不是必须的,里面的全部配置可以使用代码来实现。
EmbeddedViaXml.scala
import java.io.File
import java.net.URL
import java.util
import org.eclipse.jetty.server.Server
import org.eclipse.jetty.server.handler.ContextHandler
import org.eclipse.jetty.xml.XmlConfiguration;
object EmbeddedViaXml
{
def main(args: Array[String]): Unit = {
try
{
println(System.getProperty("user.dir"))
val configuration : XmlConfiguration = new XmlConfiguration(new File("jetty-https.xml").toURI().toURL())
val obj = configuration.configure()
val server : Server = obj.asInstanceOf[Server]
server.setStopAtShutdown(true)
val contextHandler = new ContextHandler()
println("ContextHandler...")
contextHandler.setMaxFormContentSize(51200000)
contextHandler.setContextPath("/jtEnv0y")
println("setContextPath /jtEnv0y")
val handler = new jtHandler()
contextHandler.setHandler(handler)
server.setHandler(contextHandler)
server.start()
println("start server")
server.join()
}catch {
case e :Throwable => e.printStackTrace()
}
}
}
jtHandler.scala
import javax.servlet.http.{HttpServletRequest, HttpServletResponse}
import org.eclipse.jetty.server.Request
import org.eclipse.jetty.server.handler.AbstractHandler
class jtHandler extends AbstractHandler{
override def handle(target: String,
req: Request,
request: HttpServletRequest,
response: HttpServletResponse) = {
response.setContentType("application/json; charset=utf-8")
println(target)
println(req.getContextPath)
println(req.getContext)
if (target.contains("jtEnv0y") || req.getContextPath() == "/jtEnv0y"){
val str = Common.getJson(Array("测试成功"))
Common.printString(str,response)
}
else {
Common.printString("请输入正确的路由",response)
}
}
}
Common.scala
import javax.servlet.http.HttpServletResponse
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
object Common {
def getJson(res:Any): String ={
new ObjectMapper().registerModule(DefaultScalaModule).writeValueAsString(res)
}
/**
* 用response输出json串
*/
def printString(str: String, response: HttpServletResponse): Unit = {
try {
val out = response.getWriter
out.print(str)
out.flush()
out.close()
} catch {
case e: Exception => println("exception message:", e)
}
}
}
测试
运行EmbeddedViaXml,然后在浏览器输入:https://localhost:61361/jtEnv0y/586
说明:还有一种方法,需要jetty.xml,jetty-https.xml,jetty-ssl.xml三个配置文件,本教程的jetty-https.xml相当于把三个配置文件集合到了一起。
参考:
http://juplo.de/configure-https-for-jetty-maven-plugin-9-0-x/#comment-53352
https://stackoverflow.com/questions/3794892/howto-use-https-ssl-with-maven-mortbay-jetty-plugin/31241196?s=1|10.4523#31241196
http://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html
https://stackoverflow.com/questions/17817375/how-can-i-programmatically-start-a-jetty-server-with-multiple-configuration-file?noredirect=1