สถานการณ์เลวร้ายที่สุดของคุณไม่ได้เลวร้ายอย่างที่คุณคิด
คุณกำลังแยกวิเคราะห์ฟีด RSS อยู่แล้วดังนั้นคุณจึงมี URL ของรูปภาพอยู่แล้ว สมมติว่าคุณมี URL http://otherdomain.com/someimage.jpg
ของรูปภาพเช่น คุณเขียน URL https://mydomain.com/imageserver?url=http://otherdomain.com/someimage.jpg&hash=abcdeafad
นี้เป็น ด้วยวิธีนี้เบราว์เซอร์จะส่งคำขอผ่าน https เสมอดังนั้นคุณจึงกำจัดปัญหาได้
ส่วนถัดไป - สร้างหน้าพร็อกซีหรือ servlet ที่ทำสิ่งต่อไปนี้ -
- อ่านพารามิเตอร์ url จากสตริงการสืบค้นและตรวจสอบแฮช
- ดาวน์โหลดภาพจากเซิร์ฟเวอร์และพร็อกซีกลับไปที่เบราว์เซอร์
- หรือแคชอิมเมจบนดิสก์
โซลูชันนี้มีข้อดีบางประการ คุณไม่จำเป็นต้องดาวน์โหลดภาพในขณะที่สร้าง html คุณไม่จำเป็นต้องจัดเก็บภาพไว้ในเครื่อง นอกจากนี้คุณยังไร้สัญชาติ URL มีข้อมูลทั้งหมดที่จำเป็นในการแสดงภาพ
สุดท้ายพารามิเตอร์แฮชมีไว้เพื่อความปลอดภัย คุณต้องการให้ servlet ของคุณแสดงรูปภาพสำหรับ URL ที่คุณสร้างขึ้นเท่านั้น ดังนั้นเมื่อคุณสร้าง url ให้คำนวณmd5(image_url + secret_key)
และต่อท้ายเป็นพารามิเตอร์แฮช ก่อนที่คุณจะตอบสนองคำขอให้คำนวณแฮชใหม่และเปรียบเทียบกับสิ่งที่ส่งถึงคุณ เนื่องจาก 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);
}
}