2012-02-27 93 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