Skenario terburuk Anda tidak seburuk yang Anda pikirkan.
Anda sudah mengurai umpan RSS, jadi Anda sudah memiliki URL gambarnya. Katakanlah Anda memiliki URL gambar seperti http://otherdomain.com/someimage.jpg
. Anda menulis ulang URL ini sebagai https://mydomain.com/imageserver?url=http://otherdomain.com/someimage.jpg&hash=abcdeafad
. Dengan cara ini, browser selalu membuat permintaan melalui https, jadi Anda bisa mengatasi masalah tersebut.
Bagian selanjutnya - buat halaman proxy atau servlet yang melakukan hal berikut -
- Baca parameter url dari string kueri, dan verifikasi hash
- Unduh gambar dari server, dan proksi kembali ke browser
- Secara opsional, buat cache gambar di disk
Solusi ini memiliki beberapa keunggulan. Anda tidak perlu mengunduh gambar pada saat membuat html. Anda tidak harus menyimpan gambar secara lokal. Juga, Anda tidak memiliki kewarganegaraan; url berisi semua informasi yang diperlukan untuk menyajikan gambar.
Terakhir, parameter hash adalah untuk keamanan; Anda hanya ingin servlet Anda menampilkan gambar untuk url yang telah Anda buat. Jadi, saat Anda membuat url, hitung md5(image_url + secret_key)
dan tambahkan sebagai parameter hash. Sebelum Anda melayani permintaan, hitung ulang hash dan bandingkan dengan apa yang diteruskan kepada Anda. Karena secret_key hanya diketahui oleh Anda, tidak ada orang lain yang dapat membuat url valid.
Jika Anda mengembangkan aplikasi di java, Servlet hanyalah beberapa baris kode. Anda harus dapat memindahkan kode di bawah ini ke teknologi back-end lainnya.
/*
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);
}
}