Number of visits to the IP statistics website
Ip |
Count |
192.168.1.111 |
2 |
192.168.1.112 |
59 |
Statistical work needs to be performed before all resources are available, so it can be placed in the filter.
We are not going to intercept this filter! Because we are only used to do statistics.
Use something to load the statistic data. map<string,integer>
The entire site only needs a map!
when the map was created (using Servletcontextlistener, it was created when the server was started, and only in ServletContext), where is the map saved to! (map saved to ServletContext!!!) )
- The map needs to be used to save the data in the filter
- Map needs to be used on the page to print the data in the map
1 description
The website counts the number of times each IP address accesses this site.
2 analysis
Because a site may have multiple pages, regardless of which page is accessed, the number of visits is counted, so it is most convenient to use filters .
Because of the need for IP statistics, you can create a map in the filter, using the IP key, the number of accesses is value. When there is a user access, obtain the requested IP, if the IP exists in the map, indicating the previous access, then add 1 to the number of visits, the IP in the map does not exist, then set the number of 1.
store this map in ServletContext!
3 Code
index.jsp
<body> <table align="center" width="50%" border="1"> <tr> <th>ip Address </th> <th> Times </th> </tr> <c:foreach items= "${applicationscope.ipcountmap}" var="entry"> <tr> <td>${entry.key}</td> <td>${entry.value}</td> </tr> </c:forEach> [Cui 1] </table> </body> |
IPFilter
Public class IPFilter implements Filter { Private ServletContext context; Public void init (filterconfig fconfig) throws servletexception { context = Fconfig.getservletcontext (); [Cui 2] save ServletContext map<string, integer> Ipcountmap = Collections . Synchronizedmap (new linkedhashmap<string, integer> ()); [Cui 3] create a map and save it to ServletContext Context.setattribute ("Ipcountmap", Ipcountmap); } @SuppressWarnings ("Unchecked") Public void DoFilter (servletrequest request, servletresponse response, Filterchain chain) throws IOException, servletexception { HttpServletRequest req = (httpservletrequest) request; String IP = req.getremoteaddr (); [Cui 4] map<string, integer> Ipcountmap = (map<string, integer>) context . getattribute ("Ipcountmap"); [Cui 5] Integer count = Ipcountmap.get (IP); [Cui 6] if (count = = null) { Count = 1; [Cui 7] } Else { Count + = 1; [Cui 8] Otherwise add 1 to the original number of times } Ipcountmap.put (IP, count); [Cui 9] Set the IP and number of times to map Context.setattribute ("Ipcountmap", Ipcountmap); [Cui] store the map in the context Chain.dofilter (request, response); [Cui one] release! } Public void Destroy () {} } |
<filter> <display-name>IPFilter</display-name> <filter-name>IPFilter</filter-name> <filter-class>cn.itcast.filter.ip.IPFilter</filter-class> </filter> <filter-mapping> <filter-name>IPFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
[Cui 1] loops through the map in ServletContext, where key is the IP address and value is the number of accesses
[Cui 2] save ServletContext
[Cui 3] create a map and save it to ServletContext
[Cui 4] get the requester's IP
[Cui 5] get map in context
[Cui 6] get the current IP access number in the map
[Cui 7] If this IP does not exist in the map, then set the access count to 1
[Cui 8] Otherwise add 1 to the original number of times
[Cui 9] set the IP and number of times to map
[Cui] store the map in the context
[Cui one] release!
Full code:
Afilter
PackageCn.itcast.web.filter;Importjava.io.IOException;ImportJava.util.Map;ImportJavax.servlet.Filter;ImportJavax.servlet.FilterChain;ImportJavax.servlet.FilterConfig;ImportJavax.servlet.ServletContext;Importjavax.servlet.ServletException;Importjavax.servlet.ServletRequest;ImportJavax.servlet.ServletResponse;/*** Get map from Application * Get the current client's IP * from request and save the results to map *@authorCXF **/ Public classAfilterImplementsFilter {Privatefilterconfig config; Public voiddestroy () {} Public void doFilter(servletrequest request, servletresponse response, Filterchain chain)throwsIOException, servletexception {/** 1. Get the map * 2 in Application . Obtain the current client's IP address * 3 from request. Check to see if there is an IP corresponding access number in the map, and if so, save the number of times +1 back to * 4. If this IP is not present, then this is the first time to access the site, set the number of visits to 1*/ /** 1. Get appliction*/ServletContext App=Config.getservletcontext (); Map<String,Integer> map = (map<string, integer>) app.getattribute ("Map"); /** 2. Get the IP address of the client*/String IP=request. getremoteaddr (); /** 3. Make judgments*/ if(Map.containskey (IP)) {//This IP exists in the map, stating that it is not the first time to access intCNT =map.get (IP); Map.put (IP, CNT+1); } Else{//This IP does not exist in the map, it is the first time to visit map.put (IP, 1); } App.setattribute ( "map", map); // Put the map back in the app Chain.dofilter (request, response); // sure release . } /*** This method is executed when the server is started, and this method executes only once! */ Public voidInit (Filterconfig fconfig)throwsservletexception { This. config =Fconfig; }}
Alistener
PackageCn.itcast.web.listener;ImportJava.util.LinkedHashMap;ImportJava.util.Map;ImportJavax.servlet.ServletContext;Importjavax.servlet.ServletContextEvent;ImportJavax.servlet.ServletContextListener; Public classAlistenerImplementsServletcontextlistener {/*** Create map at server startup, save to ServletContext */ Public voidcontextinitialized (Servletcontextevent sce) {//Create a map map<string,integer> Map = new linkedhashmap<string,integer>(); //Get ServletContext ServletContext application = sce.getservletcontext (); //Save the map to the applicationApplication.setattribute ("Map", map); Named map, can also be any other} Public voidcontextdestroyed (Servletcontextevent sce) {}}
Learning Notes Filter App _1 (number of visits to the IP statistics site)