Remember that requests for images are separate from the requests for pages. It works kind of like this dialog between the browser and server:
browser: please send /index.html server: okay, here it is: <html> <head></head> <body><img src="/images/bmx_mullet.jpg"></body> </html> browser: (oh! I need an image, I better ask for it...) please send /images/bmx_mullet.jpg server: okay, here it is: 001010100100101010101001010... Because it works this way, putting images in /WEB-INF will prevent the server from being able to serve them normally. Unless you have a well-thought-out reason to put them there, it is probably not a good idea. If you have images that you want people to be authenticated to see, you can simply put them in a directory that is protected via container-managed security, as defined in your web.xml. Then let the server do its job serving the images. Your images are secured, and no custom servlets or actions are required. If the images are files and just need more fine-grained security, a Filter might be appropriate. However, be careful not to create an image dumping ground that will end up full of stale images. Backup and sharing among clustered servers can be an issue also. If an image only needs to be seen once, writing it to a file might not be a very good idea. A servlet or an Action to stream the image data back to the user might be more appropriate. That way you don't have to manage files, which can be problematic in many ways. For example, if you have an action that shows a page with employee info including a dynamically-generated graph of their salary history over time, your browser/server dialog might look like this: browser: please send /viewEmployee.do?id=100 server: okay, here it is: (server invokes Struts Action to show employee page) <html> <head></head> <body> Employee Number: 100<br> Name: Kid Rock<br> Salary History:<br> <img src="/servlet/employeeSalaryHistory.gif?id=100"> </body> </html> browser: please send /servlet/employeeSalaryHistory.gif?id=100 server: okay, here it is: (server runs servlet mapped to /servlet/employeeSalaryHistory.gif that dynamically creates an employee history salary chart image and streams the data back in the response) 001010100100101010101001010... Another case where it can be useful to use an action or servlet to stream the data back is when you allow users to upload images and you want to store them as BLOBs in the db rather than the filesystem for easy backups, clusters, or whatever reason. There are no files on the disk, so you need to write out img tags that will ask your servlet/Action for the image they want and then have the servlet/Action load the image from the db and stream the data back. When streaming data from an action or servlet, be sure to set the MIME type of the response appropriately. Using a mapping that looks like an image filename (/something.jpg)can also be helpful to browser when it needs to figure out what kind of file it is going to get back. However, it probably wouldn't be a good idea to send an GIF in response to a request for /servlet/showImage.jpg, so only do that if you know the type. Or make the mapping /showImage/* and write out img tags with something like src="/showImage/2259.gif" to match the real type of the file. The "filename" from the URL can help, but it is most important to call response.setContentType() with the right MIME type string. Content length should be set as well. In the case where it is okay for the browser to cache the images (uploaded product image that lots of people will look at, etc.), you might be able to increase page load performance and decrease server load significantly by creating a servlet that implements the getLastModified() method. That made a huge difference in page load times on a project I worked on. -Max -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>