2012-02-27 92 views
5

我有(第1頁)我的網頁上點擊此鏈接:如何建立一個鏈接,將您從https轉回http?

<a href="@{Controller.action1().secure()}">Link1</a> 

說帶我到一個頁面(第2頁)通過https。如何在頁面2上建立一個鏈接,使我從https返回http?我認爲@@ notation會做的伎倆:

<a href="@@{Controller.action2()}">Link2</a> 

但它不,action2也通過https調用。

+0

什麼是您生成的HTML是什麼樣子?如果您的鏈接不包含協議,也許您可​​以手動添加前綴「http://」。 – 2012-02-27 01:57:48

+0

@ XavierHolt謝謝,我試過這個,它的工作原理。我錯誤地認爲'@@ {...}'總是給出完整的'http://'路徑。如果我使用'@ {...}'(提供相對路徑)而不是'@@ {...}'我可以手動設置'http://'。不優雅,但工程。另一方面,亞歷山大波諾馬連科的答案看起來像一個可靠的解決方案。 – stojke 2012-02-27 16:49:17

回答

3

播放沒有這將是相反的,以確保()的方法,但你可以自己定製JavaExtension實現它:

import play.templates.JavaExtensions; 
import play.mvc.Router.ActionDefinition; 

public class MyExtensions extends play.templates.JavaExtensions { 

    public static String unsecure(ActionDefinition action) { 
      if (!action.url.contains("http://") && !action.url.contains("https://")) { 
       action.absolute(); 
      } 
      action.url = action.url.replace("https:", "http:"); 
      return action.url; 
     } 

自定義擴展方法應該返回String,參數將舉行增強對象,as the documentation suggests。該代碼幾乎與secure method's code相同。

使用這種方法,你現在可以使用:

href="@{Controller.action2().unsecure()}" 
+0

太棒了!奇蹟般有效!現在唯一需要解決的問題是使secure()和unsecure()方法不僅改變協議,還改變根據application.conf的端口。有一張針對該錯誤提出的票([ticket](https://play.lighthouseapp.com/projects/57987/tickets/362-using-secure-does-not-change-port-when-reverse-routing))但我不知道爲什麼還沒有解決。 – stojke 2012-02-27 18:18:00