1    package geekblog.filters;
2    
3    
4    import java.text.*;
5    import java.util.*;
6    import javax.servlet.*;
7    import javax.servlet.http.*;
8    import geekblog.*;
9    
10   
11   /**
12    * Filter to track referrals from other sites that have hyperlinked here.
13    */
14   public class ReferralsFilter
15     implements Filter
16   {
17     private FilterConfig config;
18     private Date refDate;
19   
20     private static final SimpleDateFormat datef = new SimpleDateFormat("yyyyMMdd");
21   
22     public void init(FilterConfig config)
23     {
24       this.config = config;
25       refDate = new Date();
26   
27       Set referrers = Collections.synchronizedSet(new HashSet());
28       Map referrersHits = Collections.synchronizedMap(new HashMap());
29       config.getServletContext().setAttribute("referrers", referrers);
30       config.getServletContext().setAttribute("referrersHits", referrersHits);
31     }
32     public void destroy()
33     {
34       // Suppose I could persist the referers, but if we're going down, do we
35       // really care?
36     }
37   
38   
39     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
40       throws ServletException, java.io.IOException
41     {
42       Set referers = (Set)(config.getServletContext().getAttribute("referrers"));
43       Map referersHits = (Map)(config.getServletContext().getAttribute("referrersHits"));
44   
45   	Date todayDate = new Date();
46   	if (!datef.format(todayDate).equals(datef.format(refDate)))
47       {
48         referers.clear();
49         referersHits.clear();
50         refDate = todayDate;
51   	}
52   	
53       String weblogUrl = 
54         "http://" + request.getServerName() + 
55         (request.getServerPort() != 80 ? ":" + request.getServerPort() : "") +
56         ((HttpServletRequest)request).getContextPath();
57       String referer = ((HttpServletRequest)request).getHeader("Referer");
58       
59       if(referer != null &&
60          !referer.startsWith(weblogUrl) && 
61          !referer.startsWith("http://127.0.0.1") &&
62          !referer.startsWith("http://localhost") &&
63          referer.indexOf(":5335") < 0)
64       {
65         referers.add(referer);
66   
67         Integer hits = (Integer)referersHits.get(referer);
68         if (hits == null)
69           referersHits.put(referer, new Integer(1));
70         else
71           referersHits.put(referer, new Integer(hits.intValue() + 1));
72       }
73   
74       chain.doFilter(request, response);
75     }
76   }
77