目前我试图改善我的tomcat知道如何。我试图用SSL设置tomcat。 我的想法是,我得到了/ app不需要任何授权的路径,以及路径/管理员,需要进行基础认证。我想它只是缺乏关于SSL的一般知识,我无法理解会发生什么。
当我使用网址http://localhost:8080/myapp/app/
时,它可以正常显示我的网页。现在我将/ app更改为/ admin。之后,我的网址为https://localhost/myapp/admin
并且它无法正常工作,因为缺少8443端口。我不明白为什么它会自动更改为https,但之后端口丢失了?我的问题是什么?如何解决?
非常感谢任何帮助:)
我的server.xml:
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on"/>
<Listener className="org.apache.catalina.core.JasperListener"/>
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
/>
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="${catalina.home}/myapp.keystore"
keystorePass="histackoverflow"/>
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.MemoryRealm" />
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b"/>
</Host>
</Engine>
</Service>
我的web.xml看起来像这样:
<servlet>
<servlet-name>MyApp REST Service</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>main.ch.myapp.resource.app</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Myapp REST Service</servlet-name>
<url-pattern>/app-api/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>MyApp Admin REST Service</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>main.ch.myapp.resource.admin</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MyApp Admin REST Service</servlet-name>
<url-pattern>/admin-api/*</url-pattern>
</servlet-mapping>
<security-constraint>
<web-resource-collection>
<web-resource-name>MyApp Admin</web-resource-name>
<url-pattern>/admin/*</url-pattern>
<url-pattern>/admin-api/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
答案 0 :(得分:1)
由于<transport-guarantee>CONFIDENTIAL</transport-guarantee>
中包含<security-constraint>
,因此对https的更改已完成。
看看:
The Java EE 6 Tutorial, Volume I. Specifying Security Constraints
The Java EE 6 Tutorial, Volume I. Specifying a Secure Connection
指定安全连接
用户数据约束(
TutorialUser-data-constraint
部署描述符)包含transport-guarantee
元素。一个 用户数据约束可用于要求受保护的传输 所有人都可以使用HTTPS连接(HTTP over SSL)等层连接 受约束的URL模式和安全性中指定的HTTP方法 约束。运输保障的选择包括CONFIDENTIAL, INTEGRAL,或无。如果指定CONFIDENTIAL或INTEGRAL作为 安全约束,它通常意味着使用SSL 必需,并且该类型的安全约束适用于所有请求 是否匹配Web资源集合中的URL模式 只是登录对话框。
此外,我认为端口8443不可用,因为您没有将Tomcat配置为使用SSL。
在以下链接中,您可以找到有关在Tomcat上配置SSL支持的精彩方法:
Apache Tomcat 7. SSL/TLS Configuration HOW-TO
---编辑(server.xml配置已发布)---
要重定向到端口8443,您需要更改连接器配置,如下所示:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
Apache Tomcat 7. The AJP Connector
redirectPort
如果此连接器支持非SSL请求,并且请求是 已收到匹配的
security-constraint
需要SSL 运输时,Catalina会自动将请求重定向到 这里指定的端口号。