C:\projects\FilterTutorial\src\com\acme\filter\ImageFilter.java

1    package com.acme.filter; 
2     
3    import com.sun.image.codec.jpeg.JPEGImageEncoder; 
4     
5    import javax.servlet.FilterChain; 
6    import javax.servlet.ServletException; 
7    import javax.servlet.ServletRequest; 
8    import javax.servlet.ServletResponse; 
9    import javax.servlet.http.HttpServletResponse; 
10   import java.awt.*; 
11   import java.awt.image.BufferedImage; 
12   import java.io.ByteArrayOutputStream; 
13   import java.io.IOException; 
14   import java.io.OutputStream; 
15    
16   public class ImageFilter extends GenericFilter { 
17       public void doFilter(final ServletRequest request, final ServletResponse response, FilterChain chain) throws IOException, ServletException 
18       { 
19           String message = getFilterConfig().getInitParameter("message"); 
20           GenericResponseWrapper wrapper = new GenericResponseWrapper((HttpServletResponse) response); 
21           chain.doFilter(request, wrapper); 
22           OutputStream out = response.getOutputStream(); 
23           if (contentIsUncachedImage(wrapper) && message != null) 
24           { 
25               ByteArrayOutputStream imageStream = manipulateImage(message, wrapper.getData()); 
26               response.setContentLength(imageStream.size()); 
27               response.setContentType("image/jpeg"); 
28               out.write(imageStream.toByteArray()); 
29           } 
30           else 
31           { 
32               out.write(wrapper.getData()); 
33           } 
34           out.flush(); 
35           out.close(); 
36       }
37 38
public ByteArrayOutputStream manipulateImage(String message, byte[] imageData) throws ServletException 39 { 40 ByteArrayOutputStream imageStream; 41 Frame frame = null; 42 Graphics graphics = null; 43 try 44 { 45 frame = new Frame(); 46 frame.addNotify(); 47 MediaTracker mt = new MediaTracker(frame); // frame acts as an ImageObserver 48 Image image = Toolkit.getDefaultToolkit().createImage(imageData); 49 mt.addImage(image, 0); 50 mt.waitForAll(); 51 int w = image.getWidth(frame); 52 int h = image.getHeight(frame); 53 BufferedImage offscreen = new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR); 54 graphics = offscreen.getGraphics(); 55 graphics.drawImage(image, 0, 0, frame); 56 graphics.setFont(new Font("Arial", Font.BOLD | Font.ITALIC, 30)); 57 graphics.setColor(Color.black); 58 graphics.drawString(message, 10, 30); 59 imageStream = new ByteArrayOutputStream(); 60 JPEGImageEncoder encoder = com.sun.image.codec.jpeg.JPEGCodec.createJPEGEncoder(imageStream); 61 encoder.encode(offscreen); 62 } 63 catch (InterruptedException e) 64 { 65 throw new ServletException(e.getMessage()); 66 } catch (IOException e) 67 { 68 throw new ServletException(e.getMessage()); 69 } 70 finally 71 { 72 if (graphics != null) 73 { 74 graphics.dispose(); 75 } 76 if (frame != null) 77 { 78 frame.removeNotify(); 79 } 80 } 81 return imageStream; 82 }
83 84
public boolean contentIsUncachedImage(GenericResponseWrapper wrapper) { 85 if (wrapper.getContentType().startsWith("image/")) { 86 if (wrapper.getData().length > 0) { 87 return true; 88 } 89 } 90 return false; 91 } 92 } 93