2012-02-27 15 views
5

Mam ten link na mojej stronie (Strona1):Jak utworzyć link, który przeniesie Cię z https do http?

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

że bierze mnie na stronę (Strona2) za pośrednictwem protokołu HTTPS. Jak utworzyć link na stronie 2, który przenosi mnie z https na http? Pomyślałem, że notacja @@ może załatwić sprawę:

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

, ale nie działa, akcja 2 jest również wywoływana przez https.

+0

Co twoja generowane HTML wygląda? Jeśli twoje linki nie zawierają protokołów, możesz dodać przedrostek 'http: //' ręcznie. –

+0

@XavierHolt dzięki, próbowałem tego i to działa. Miałem złe wrażenie, że '@@ {...}' zawsze dawało pełną ścieżkę 'http: //'. Jeśli użyję '@ {...}' (który podaje względną ścieżkę) zamiast '@@ {...} mogę ręcznie ustawić' http: // '. Nie elegancki, ale działa. Odpowiedź Alexandra Ponomarenko z drugiej strony wygląda na solidne rozwiązanie. – stojke

Odpowiedz

3

Play nie ma metody, która byłaby przeciwna do zabezpieczenia(), ale można go wdrożyć się z niestandardowym 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; 
     } 

rozszerzenie metod klienta powinien powrócić String, a parametr będzie trzymać ulepszony obiekt, as the documentation suggests. Kod jest prawie identyczny z secure method's code.

Dzięki tej metodzie można teraz używać:

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

Świetnie! Działa jak marzenie! Jedyne, co pozostało do naprawienia, to sprawić, że metody secure() i unsecure() zmienią nie tylko protokół, ale także port zgodnie z application.conf. Jest bilet zgłoszony dla tego błędu ([bilet] (https://play.lighthouseapp.com/projects/57987/tickets/362-using-secure-does-not-change-port-when-reverse-routing)) ale nie wiem, dlaczego jeszcze nie zostało to rozwiązane. – stojke

Powiązane problemy