Tình huống xấu nhất của bạn không tệ như bạn nghĩ.
Bạn đã phân tích cú pháp nguồn cấp dữ liệu RSS, vì vậy bạn đã có các URL hình ảnh. Giả sử bạn có một URL hình ảnh như thế nào http://otherdomain.com/someimage.jpg
. Bạn viết lại URL này thànhhttps://mydomain.com/imageserver?url=http://otherdomain.com/someimage.jpg&hash=abcdeafad
. Bằng cách này, trình duyệt luôn đưa ra yêu cầu qua https, vì vậy bạn sẽ thoát khỏi sự cố.
Phần tiếp theo - tạo một trang proxy hoặc servlet thực hiện những việc sau -
- Đọc tham số url từ chuỗi truy vấn và xác minh hàm băm
- Tải xuống hình ảnh từ máy chủ và ủy quyền nó trở lại trình duyệt
- Tùy chọn, lưu hình ảnh vào bộ nhớ cache trên đĩa
Giải pháp này có một số ưu điểm. Bạn không phải tải xuống hình ảnh tại thời điểm tạo html. Bạn không cần phải lưu trữ hình ảnh cục bộ. Ngoài ra, bạn không có quốc tịch; url chứa tất cả thông tin cần thiết để cung cấp hình ảnh.
Cuối cùng, tham số băm là để bảo mật; bạn chỉ muốn servlet của mình cung cấp hình ảnh cho các url mà bạn đã xây dựng. Vì vậy, khi bạn tạo url, hãy tính toán md5(image_url + secret_key)
và nối nó làm tham số băm. Trước khi bạn gửi yêu cầu, hãy tính toán lại hàm băm và so sánh nó với những gì đã được chuyển cho bạn. Vì khóa bí mật chỉ có bạn biết nên không ai khác có thể tạo các url hợp lệ.
Nếu bạn đang phát triển trong java, Servlet chỉ là một vài dòng mã. Bạn sẽ có thể chuyển mã bên dưới trên bất kỳ công nghệ back-end nào khác.
/*
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);
}
}