Ваш найгірший сценарій не такий поганий, як ви думаєте.
Ви вже аналізуєте канал RSS, тож у вас вже є 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-адрес. Отже, коли ви створюєте URL-адресу, обчислітьmd5(image_url + secret_key)
і додайте її як параметр хешу. Перш ніж подати запит, перерахуйте хеш і порівняйте його з переданим вам. Оскільки секретний ключ відомий тільки вам, ніхто інший не може створювати дійсні URL-адреси.
Якщо ви розробляєте в Java, Servlet - це лише кілька рядків коду. Ви повинні мати можливість перенести наведений нижче код на будь-яку іншу внутрішню технологію.
/*
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);
}
}