IE和Chrome的Cookie问题(使用java)

时间:2011-05-25 07:46:14

标签: java servlets cookies internet-explorer-8

我正在尝试从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();
}

}

1 个答案:

答案 0 :(得分:1)

Cookie是基于域的。许多浏览器拒绝嵌入式资源(CSS / JS /图像)上的cookie,这些资源是从其他域提供的,而不是从提供页面的域。

您希望使用JavaScript来管理Cookie。 Google Analytics也是这样做的。在quirksmode.org,你可以找到一个很好的教程how to manage cookies using JavaScript。然后,任何基于cookie的信息都可以作为请求参数发送到图像URL上。