HttpServletRequest的getRequestURL方法獲取不到https協議請求問題


近來公司官網的域名協議提升為https后,原先在SpringMVC中使用攔截器HandlerInterceptor攔截請求,在攔截器中使用HttpServletRequest獲取攔截到的請求路徑(不包含請求參數的路徑)對老官網的資訊url重定向到新官網的url。

代碼如下:

public class RedirectInterceptor implements HandlerInterceptor {

    private static final Map<String, String> map = new HashMap<String, String>();

   
static { map.put("http://www.xxxxxx.com/mtbd_1817.html","http://www.xxxxxx.com/ynjsx/3382.html"); map.put("http://www.xxxxxx.com/mtbd_28.html","http://www.xxxxxx.com/jkdt/4626.html"); } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) { String requestURL = request.getRequestURL().toString(); String redirectURL = map.get(requestURL); if (Strings.isNotBlank(redirectURL)) { response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); response.setHeader("Location", redirectURL); } return true; } }

因為現在官網的請求協議升級為https了,所以我將靜態代碼塊中的http協議都替換成https了。

 

但是出現的問題是,原先官網為http協議是正常的重定向,更換為https后,請求的路徑https協議的,程序獲取到的一直是http協議的,造成后面的邏輯出現錯誤。

原因分析:

由於項目使用到了Nginx代理,整個項目是使用Nginx+Tomcat部署的,因此Tomcat端收到的請求都是從Nginx轉發過來的,因此產生這個問題的原因就是Nginx的配置問題了

 

解決方法:

需要在nginx里面配置好對應ssl以及把證書放到對應位置
例如:

listen 443;
 server_name xxx.xxxx.com;
 ssl on;
 root html;
 index index.html index.htm;
 ssl_certificate cert/123456xxxxxx.pem;
 ssl_certificate_key cert/123456xxxxxx.key;
 ssl_session_timeout 5m;
 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 ssl_prefer_server_ciphers on;

 


配置完成后修改tomcat,/conf/server.xml

找到70行,默認位置修改為:

<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
scheme="https"
redirectPort="8443" proxyPort="443" />

重啟tomcat即可

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM