|
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