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">云化转型myScalaTest3jetty-ssl.keystore</Set>

                    <Set name="TrustStorePath">云化转型myScalaTest3jetty-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

原文地址:https://www.cnblogs.com/envoy/p/8358794.html