我正在尝试从servlet向客户端发送图像,并将包含图像id的cookie添加到repsonse。 (我不想显示超过N次的同一图像。)
看起来Internet Explorer不关心cookie,当我调用request.getCookies();时,我总是得到一个空引用。有了Opera,一切都很棒。
Chrome会看到Cookie,但是当我将图像写入outputStream时,我会收到以下异常: ClientAbortException:java.net.SocketException:软件导致连接中止:套接字写入错误
我还没有尝试过Mozilla。
除了Cookie之外,Internet Explorer是否有解决方法?会话适用于我的Internet Explorer。
使用Chrome时,是否有任何关于异常的提示? (图像小于1 MB)。
这是servlet代码:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpeg");
response.addHeader ("Content-Disposition", "attachment");
response.setHeader("Cache-Control", "no-cache,no-store,must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);
HttpSession session = request.getSession();
String requestURI = request.getParameter("requestURI");
String resolution = request.getParameter("resolution");
Cookie[] cookies = request.getCookies();
try
{
if (cookies == null)
coada = (new BannerChooser().Choose(1));
String filePath = null;
Iterator it = coada.iterator();
boolean found =false;
while ((!found) && it.hasNext())
{
found = true;
if (cookies!=null)
for (int i = 0; i < cookies.length; i++)
if ( Integer.parseInt(cookies[i].getValue()) == ((BannerNota)it.next()).getB().getId())
{
found = false;
break;
}
if (found)
{
BannerNota bannerToDisplay = (BannerNota)it.next();
Cookie cookie = new Cookie(bannerToDisplay.getB().getId().toString(),bannerToDisplay.getB().getId().toString());
cookie.setMaxAge(60*60*24);
cookie.setPath("/licenta");
filePath = bannerToDisplay.getB().getPath();
response.addCookie(cookie);
break;
}
}
filePath = "h:/program files/Workspace/licenta/WebRoot/" + filePath;
File f = new File(filePath);
byte[] b = new byte[(int)f.length()];
FileInputStream fis = new FileInputStream(f);
fis.read(b);
ServletOutputStream out = response.getOutputStream();
out.write(b);
out.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
答案 0 :(得分:1)
Cookie是基于域的。许多浏览器拒绝嵌入式资源(CSS / JS /图像)上的cookie,这些资源是从其他域提供的,而不是从提供页面的域。
您希望使用JavaScript来管理Cookie。 Google Analytics也是这样做的。在quirksmode.org,你可以找到一个很好的教程how to manage cookies using JavaScript。然后,任何基于cookie的信息都可以作为请求参数发送到图像URL上。