zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    iOS9--适配系列教程(原文/译文)
    电梯调度设计思路及算法
    10大高频率单词筛选
    html知识点总结
    关于博客
    Java构造器内部的多态方法
    Java初学者必学的六大Java语言要点
    Java中的length字段和length()方法
    Java学习有方法有捷径
    Java 分隔符函数split的使用注意事项
  • 原文地址:https://www.cnblogs.com/envoy/p/8358794.html
Copyright © 2011-2022 走看看