如何在Java 8+Tomcat 8.5.9的Servlet中获取浏览器请求的SSL协议版本
在Java 8 + Tomcat 8.5.9的Servlet中获取SSL协议版本
嘿,这个需求我刚好折腾过,在你当前的环境下,有两种靠谱的方法可以拿到请求使用的SSL/TLS协议版本,给你详细说下:
方法一:使用Tomcat特有的请求属性
Tomcat会把SSL相关的细节放到请求的属性里,其中就包含协议版本。你可以直接通过request.getAttribute()获取这个属性,属性名是org.apache.coyote.request.SSL_PROTOCOL。
代码示例
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取Tomcat提供的SSL协议版本属性 String sslProtocol = (String) request.getAttribute("org.apache.coyote.request.SSL_PROTOCOL"); if (sslProtocol != null) { response.getWriter().println("当前请求使用的SSL协议版本: " + sslProtocol); } else { // 说明请求不是HTTPS,或者Tomcat未正确配置SSL response.getWriter().println("无法获取SSL协议版本,请确认请求为HTTPS且Tomcat SSL配置正常"); } }
这个方法的优势是简单直接,不需要额外处理,只要是Tomcat处理的HTTPS请求,就能拿到值。不过要注意这是Tomcat专属的属性,换其他Servlet容器(比如Jetty)可能就不适用了。
方法二:使用Java EE标准API(更通用)
如果你想写更通用的代码,适配不同容器,可以用Java EE提供的getSSLSession()方法,从请求中拿到SSLSession对象,再调用它的getProtocol()方法获取版本。
代码示例
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 先判断当前请求是否是HTTPS if (request.isSecure()) { SSLSession sslSession = request.getSSLSession(); if (sslSession != null) { String sslProtocol = sslSession.getProtocol(); response.getWriter().println("当前请求使用的SSL协议版本: " + sslProtocol); } else { response.getWriter().println("无法获取SSLSession对象"); } } else { response.getWriter().println("当前请求不是HTTPS请求,无法获取SSL协议版本"); } }
这个方法是Java EE的标准接口,只要你的Servlet容器支持(Tomcat 8.5当然支持),就能正常工作。需要注意的是,非HTTPS请求调用getSSLSession()会返回null,所以一定要先通过request.isSecure()判断请求类型。
额外注意事项
- 确保你的Tomcat已经正确配置了HTTPS连接器,比如在
server.xml里配置了带SSL的Connector(参考下面的示例片段):
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true"> <SSLHostConfig> <Certificate certificateKeystoreFile="conf/localhost-rsa.jks" type="RSA"/> </SSLHostConfig> </Connector>
- 如果测试时拿到的是null,先检查请求是否真的是HTTPS(比如访问
https://localhost:8443/你的Servlet路径),再确认Tomcat的SSL配置是否生效。
内容的提问来源于stack exchange,提问作者Amey Sawant
相关产品推荐
相关产品推荐

