के साथ लॉगिन के लिए एचटीपीएस रूटिंग लागू करें मैं केवल अपने आवेदन के लॉगिन पेज के लिए https रूटिंग को लागू करना चाहता हूं।प्ले फ्रेमवर्क
क्या Play के साथ ऐसा करना संभव है! फ्रंट एंड http सर्वर के उपयोग के बिना?
के साथ लॉगिन के लिए एचटीपीएस रूटिंग लागू करें मैं केवल अपने आवेदन के लॉगिन पेज के लिए https रूटिंग को लागू करना चाहता हूं।प्ले फ्रेमवर्क
क्या Play के साथ ऐसा करना संभव है! फ्रंट एंड http सर्वर के उपयोग के बिना?
आप प्रत्येक अनुरोध को पुनर्निर्देशित करने के लिए @Before
इंटरसेप्टर का उपयोग कर सकते हैं, भले ही उपयोगकर्ता http: // सीधे टाइप करता हो। नीचे वह कोड है जिसका मैं उपयोग करता हूं (यह कंटेनरलेस play run
चलाते समय काम करता है, या जब हेरोोकू जैसे फ्रंट एंड के पीछे दौड़ता है)।
public class HttpsRequired extends Controller {
/** Called before every request to ensure that HTTPS is used. */
@Before
public static void redirectToHttps() {
//if it's not secure, but Heroku has already done the SSL processing then it might actually be secure after all
if (!request.secure && request.headers.get("x-forwarded-proto") != null) {
request.secure = request.headers.get("x-forwarded-proto").values.contains("https");
}
//redirect if it's not secure
if (!request.secure) {
String url = redirectHostHttps() + request.url;
System.out.println("Redirecting to secure: " + url);
redirect(url);
}
}
/** Renames the host to be https://, handles both Heroku and local testing. */
@Util
public static String redirectHostHttps() {
if (Play.id.equals("dev")) {
String[] pieces = request.host.split(":");
String httpsPort = (String) Play.configuration.get("https.port");
return "https://" + pieces[0] + ":" + httpsPort;
} else {
if (request.host.endsWith("domain.com")) {
return "https://secure.domain.com";
} else {
return "https://" + request.host;
}
}
}
}
आप कमाल हैं! –
आपको सक्षम होना चाहिए। निम्न कार्य करें:
चाहते हैं तो यह
क्या होगा अगर उपयोगकर्ता पता बार में यूआरएल http: //myapp.org/login https: //myapp.org/login के बजाय टाइप करता है। मुझे जो चाहिए वह नियंत्रक लॉगिन() से ही एक https पुनर्निर्देशन होगा। – emt14
यह देखने के नियंत्रक बिंदु से संभव हो सकता है नहीं लगता है काम करना चाहिए खेलने के लिए संकेत करने के लिए। टेम्पलेट पेरे समाधान से काम करता है लेकिन यह केवल टेम्पलेट से https url उत्पन्न करता है।
यदि उपयोगकर्ता या तो मैन्युअल रूप से टाइप करके या http url के लिंक का पालन करके लॉगिन कार्रवाई का उपयोग करता है, तो https को लागू/पुनर्निर्देशित करने का कोई तरीका प्रतीत नहीं होता है।
सबसे अच्छा तरीका सामने वाला प्रॉक्सी लगता है।
ऐसा करने के लिए वास्तव में कई तरीके हैं जैसा कि आप अन्य उत्तरों में देख सकते हैं –
मुझे लगता है कि आप request.secure == सत्य के लिए नियंत्रक में जांच सकते हैं और फिर https पर रीडायरेक्ट कर सकते हैं।
आपने दिमाग में 1.x प्ले किया है? मुझे Play 2.2 में कोई भी request.secure' फ़ील्ड नहीं मिल रहा है। – KajMagnus
'request.sequre' जून 2014 में जारी प्ले 2.3 में उपलब्ध है, एपीआई दस्तावेज़ देखें: http://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.api। mvc.RequestHeader – KajMagnus
यहां एक उदाहरण है जो जावा प्ले 2.1.1 और हेरोकू के साथ काम करता है।
public class ForceHttps extends Action<Controller> {
// heroku header
private static final String SSL_HEADER = "x-forwarded-proto";
@Override
public Result call(Context ctx) throws Throwable {
final Result result;
if (Play.isProd() && !isHttpsRequest(ctx.request())) {
result = redirect("https://" + ctx.request().host()
+ ctx.request().uri());
}
else {
// let request proceed
result = this.delegate.call(ctx);
}
return result;
}
private static boolean isHttpsRequest(Request request) {
// heroku passes header on
return request.getHeader(SSL_HEADER) != null
&& request.getHeader(SSL_HEADER)
.contains("https");
}
}
फिर किसी भी नियंत्रक को आप https के लिए जांचना चाहते हैं, @With (ForceHttps.class) जोड़ें। या यदि आप सभी नियंत्रकों को जांचना चाहते हैं, तो एक वर्ग जोड़ें HttpsController नियंत्रक को बढ़ाता है और आपके सभी वर्ग HttpsController का विस्तार करते हैं।
उदा।
@With(ForceHttps.class)
public class HttpsController extends Controller {
}
यह 2.5 पर मेरे लिए किसी भी समस्या के बिना काम करता है, केवल अंतर यह है कि कॉल विधि का रिटर्न प्रकार अब CompletionStage
यदि आपका एडब्ल्यूएस उपयोग कर, आप लोड बैलेंसर पर अपनी HTTPS समाप्त और HTTPS करने के लिए HTTP कनेक्शन पुनर्निर्देशित करने के लिए एक फिल्टर का उपयोग कर सकते हैं।
एडब्ल्यूएस सम्मेलन:
443 (लोड बैलेंसर) ----------> 80 (सर्वर)
80 (लोड बैलेंसर) ---------- > 80 (सर्वर)
फिल्टर:
object HTTPSRedirectFilter extends Filter with Logging {
def apply(nextFilter: (RequestHeader) => Future[SimpleResult])(requestHeader: RequestHeader): Future[SimpleResult] = {
//play uses lower case headers.
requestHeader.headers.get("x-forwarded-proto") match {
case Some(header) => {
if ("https" == header) {
nextFilter(requestHeader).map { result =>
result.withHeaders(("Strict-Transport-Security", "max-age=31536000"))
}
} else {
Future.successful(Results.Redirect("https://" + requestHeader.host + requestHeader.uri, 301))
}
}
case None => nextFilter(requestHeader)
}
}
}
हमेशा क्यों है कि किसी एक प्ले ढांचे से संबंधित सवाल ही नहीं 1.x और 2.x संस्करणों के लिए जवाब हैं पूछता है? यह देखते हुए कि वे इतने अलग हैं कि यह सिर्फ भ्रम का कारण बनता है, अगर अलग-अलग नामों के साथ नामित किया गया था ... जैसे 'प्ले' और 'रन' की तरह। –
हर किसी ने Play को बताया! जब उन्होंने 2.0 लॉन्च किया तो इसे टीम बनाएं। उन्होंने नहीं सुनी। – HelpMeStackOverflowMyOnlyHope