Twój najgorszy scenariusz nie jest taki zły, jak myślisz.
Już analizujesz kanał RSS, więc masz już adresy URL obrazów. Załóżmy, że masz adres URL obrazu, taki jak http://otherdomain.com/someimage.jpg
. Przepisujesz ten adres URL jako https://mydomain.com/imageserver?url=http://otherdomain.com/someimage.jpg&hash=abcdeafad
. W ten sposób przeglądarka zawsze wysyła żądania przez https, więc pozbywasz się problemów.
Następna część - utwórz stronę proxy lub serwlet, który wykonuje następujące czynności -
- Przeczytaj parametr url z ciągu zapytania i zweryfikuj skrót
- Pobierz obraz z serwera i proxy go z powrotem do przeglądarki
- Opcjonalnie buforuj obraz na dysku
To rozwiązanie ma kilka zalet. Nie musisz pobierać obrazu w momencie tworzenia HTML. Nie musisz przechowywać obrazów lokalnie. Ponadto jesteś bezpaństwowcem; adres URL zawiera wszystkie informacje niezbędne do wyświetlenia obrazu.
Wreszcie parametr hash służy do celów bezpieczeństwa; chcesz, aby serwlet obsługiwał obrazy tylko dla utworzonych adresów URL. Tak więc podczas tworzenia adresu URL oblicz go md5(image_url + secret_key)
i dołącz jako parametr hash. Zanim obsłużysz żądanie, ponownie oblicz skrót i porównaj go z tym, co zostało Ci przekazane. Ponieważ tajny_klucz jest znany tylko Tobie, nikt inny nie może tworzyć prawidłowych adresów URL.
Jeśli tworzysz w Javie, serwlet to tylko kilka linijek kodu. Powinieneś być w stanie przenieść poniższy kod do dowolnej innej technologii zaplecza.
/*
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);
}
}