Javaweb实现之Filter分析ip统计网站的访问次数

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Javaweb实现之Filter分析ip统计网站的访问次数统计工作需要在所有资源之前都执行,那么就可以放到Filter中了。我们这个过滤器不打算做拦截操作!因为我们只是用来做统计的。用什么东西来装载统计的数据。MapString,Integer整个网站只需要一个Map即可!Map什么时候创建(使用ServletContextListener,在服务器启动时完成创建,并只在到ServletContext中),Map保存到哪里!(Map保存到ServletContext中!!!)Map需要在Filter中用来保存数据Map需要在页面使用,打印Map中的数据1分析因为一个网站可能有多个页面,无论哪个页面被访问,都要统计访问次数,所以使用过滤器最为方便。因为需要分IP统计,所以可以在过滤器中创建一个Map,使用IP为key,访问次数为value。当有用户访问时,获取请求的IP,如果IP在Map中存在,说明以前访问过,那么在访问次数上加1,即可;IP在Map中不存在,那么设置次数为1。把这个Map存放到ServletContext中!2代码复制代码?xmlversion=1.0encoding=UTF-8?web-appversion=2.5xmlns=:xsi=:schemaLocation=://java.sun.com/xml/ns/javaee/web-app_2_5.xsdfilterfilter-nameMyFilter/filter-namefilter-classcom.cug.filter02.MyFilter/filter-class/filterfilter-mappingfilter-nameMyFilter/filter-nameurl-pattern/*/url-pattern/filter-mappinglistenerlistener-classcom.cug.filter02.MyListener/listener-class/listener/web-app复制代码复制代码packagecom.cug.filter02;importjava.util.LinkedHashMap;importjava.util.Map;importjavax.servlet.ServletContext;importjavax.servlet.ServletContextEvent;importjavax.servlet.ServletContextListener;publicclassMyListenerimplementsServletContextListener{@OverridepublicvoidcontextDestroyed(ServletContextEventarg0){}@OverridepublicvoidcontextInitialized(ServletContextEventarg0){ServletContextcontext=arg0.getServletContext();MapString,IntegeripMap=newLinkedHashMapString,Integer();context.setAttribute(ipMap,ipMap);}}packagecom.cug.filter02;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;publicclassMyFilterimplementsFilter{privateFilterConfigfilterConfig;@Overridepublicvoiddestroy(){}@OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{ServletContextcontext=filterConfig.getServletContext();MapString,IntegeripMap=(MapString,Integer)context.getAttribute(ipMap);Stringip=request.getRemoteAddr();if(ipMap.con(ip)){Integercount=ipMap.get(ip);ipMap.put(ip,count+1);}else{ipMap.put(ip,1);}context.setAttribute(ipMap,ipMap);chain.doFilter(request,response);}@Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{this.filterConfig=filterConfig;}}复制代码复制代码%@pagelanguage=javaimport=java.util.*pageEncoding=UTF-8%%@taglibprefix=curi==request.getContextPath();StringbasePath=request.getScheme()+://+request.getServerName()+:+request.getServerPort()+path+/;%!DOCTYPEHTMLPUBLIC-//W3C//DTDHTML4.01Transitional//ENhtmlheadbasehref=%=basePath%titleMyJSP'show.jsp'startingpage/titlemetahttp-equiv=pragmacontent=no-cachemetahttp-equiv=cache-controlcontent=no-cachemetahttp-equiv=expirescontent=0metahttp-equiv=keywordscontent=keyword1,keyword2,keyword3metahttp-equiv=descriptioncontent=Thisismypage!--linkrel=stylesheettype=text/csshref=styles.css--/headbodytablealign=centerwidth=60%border=1trthip/ththcount/th/trc:forEachitems=${applicationScope.ipMap}var=entrytrtd${entry.key}/tdtd${entry.value}/td/tr/c:forEach/table/body/html复制代码注意:在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件,将的URL反向代理为的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或192.168.1.110,而并不是客户端的真实IP。经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。于是可得出获得客户端真实IP地址的方法:复制代码publicStringgetIpAddr(HttpServletRequestrequest){Stringip=request.getHeader(x-forwarded-for);if(ip==null||ip.length()==0||unknown.equalsIgnoreCase(ip)){ip=request.getHeader(Proxy-Client-IP);}if(ip==null||ip.length()==0||unknown.equalsIgnoreCase(ip)){ip=request.getHeader(WL-Proxy-Client-IP);}if(ip==null||ip.length()==0||unknown.equalsIgnoreCase(ip)){ip=request.getRemoteAddr();}returnip;}复制代码补充:最后后台可以执行一段python,完成对访问地址的统计和分析:复制代码不完整代码#-*-coding:gbk-*-importurllib2importreurl==%s&action=2%ipaddru=urllib2.urlopen(url)s=u.read()#GetIPAddressip=re.findall(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}',s)print\n******BelowResultFromIP138Database*****printIPAddress:,ip[0]#GetIPAddressLocationresult=re.findall(r'(li.*?/li)',s)foriinresult:printi[4:-5]print**45print\n复制代码

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功