आपका सबसे खराब मामला उतना बुरा नहीं है जितना आप सोचते हैं।
आप पहले से ही आरएसएस फ़ीड को पार्स कर रहे हैं, इसलिए आपके पास पहले से ही छवि URL हैं। मान लें कि आपके पास एक छवि URL जैसा है http://otherdomain.com/someimage.jpg
। आप इस URL को फिर से लिखें https://mydomain.com/imageserver?url=http://otherdomain.com/someimage.jpg&hash=abcdeafad
। इस तरह, ब्राउज़र हमेशा https पर अनुरोध करता है, जिससे आपको समस्याओं से छुटकारा मिलता है।
अगला भाग - एक प्रॉक्सी पृष्ठ या सर्वलेट बनाएं जो निम्नलिखित कार्य करता है -
- क्वेरी स्ट्रिंग से url पैरामीटर पढ़ें, और हैश सत्यापित करें
- सर्वर से छवि डाउनलोड करें, और इसे वापस ब्राउज़र पर प्रॉक्सी करें
- वैकल्पिक रूप से, डिस्क पर छवि को कैश करें
इस उपाय के कुछ फायदे हैं। Html बनाने के समय आपको इमेज डाउनलोड नहीं करनी है। आपको छवियों को स्थानीय रूप से संग्रहीत करने की आवश्यकता नहीं है। इसके अलावा, आप स्टेटलेस हैं; url में छवि की सेवा के लिए आवश्यक सभी जानकारी शामिल है।
अंत में, हैश पैरामीटर सुरक्षा के लिए है; आप केवल अपने सर्वलेट को आपके द्वारा बनाए गए यूआरएल के लिए छवियों की सेवा करना चाहते हैं। इसलिए, जब आप url बनाते हैं, तो गणना करें md5(image_url + secret_key)
और इसे हैश पैरामीटर के रूप में जोड़ें। इससे पहले कि आप अनुरोध परोसें, हैश को पुनः स्थापित करें और इसकी तुलना करें कि आपको क्या पारित किया गया था। चूंकि secret_key केवल आपके लिए जाना जाता है, कोई और मान्य url का निर्माण नहीं कर सकता है।
यदि आप जावा में विकसित कर रहे हैं, तो सर्वलेट कोड की कुछ पंक्तियाँ हैं। आपको किसी अन्य बैक-एंड तकनीक पर नीचे दिए गए कोड को पोर्ट करने में सक्षम होना चाहिए।
/*
targetURL is the url you get from RSS feeds
request and response are wrt to the browser
Assumes you have commons-io in your classpath
*/
protected void proxyResponse (String targetURL, HttpServletRequest request,
HttpServletResponse response) throws IOException {
GetMethod get = new GetMethod(targetURL);
get.setFollowRedirects(true);
/*
* Proxy the request headers from the browser to the target server
*/
Enumeration headers = request.getHeaderNames();
while(headers!=null && headers.hasMoreElements())
{
String headerName = (String)headers.nextElement();
String headerValue = request.getHeader(headerName);
if(headerValue != null)
{
get.addRequestHeader(headerName, headerValue);
}
}
/*Make a request to the target server*/
m_httpClient.executeMethod(get);
/*
* Set the status code
*/
response.setStatus(get.getStatusCode());
/*
* proxy the response headers to the browser
*/
Header responseHeaders[] = get.getResponseHeaders();
for(int i=0; i<responseHeaders.length; i++)
{
String headerName = responseHeaders[i].getName();
String headerValue = responseHeaders[i].getValue();
if(headerValue != null)
{
response.addHeader(headerName, headerValue);
}
}
/*
* Proxy the response body to the browser
*/
InputStream in = get.getResponseBodyAsStream();
OutputStream out = response.getOutputStream();
/*
* If the server sends a 204 not-modified response, the InputStream will be null.
*/
if (in !=null) {
IOUtils.copy(in, out);
}
}