a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 324|回复: 0

[专业语言] Java认证:java统计在线人数session存储

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
Java认证:java统计在线人数session存储3 ^, x2 Z$ v7 \) c! M! [
java统计在线人数(session存储信息)
! f0 G" T6 E1 E1 J$ C5 @对于登录信息时使用session存储的,所以我这里是通过实现HttpSessionAttributeListener这个接口完成的。4 v- Z% F0 J9 ~; D; B  w) Q
1、实现接口类,在web.xml文件中配置监听类,从而可以使该类完成其工作。
5 G( h4 t0 @% w' R2 B- @public class SessionListener implements HttpSessionAttributeListener
8 x1 Z7 E) W' D9 U. S{
# f$ B+ m4 W9 N* b9 M) \3 Dpublic void attributeAdded(HttpSessionBindingEvent event)
! i7 i  T9 d' g6 K( q8 M* c3 S( U{  i; y5 b4 u. n* B) ]. q
if (event.getName().equals(“userid”))
' o$ z! q+ j9 T; |' l{) Z) P8 y& Y% S; w
try1 t2 f* |" ?. F2 x1 v. h
{4 n4 t9 }' N3 z9 y  G% Y( M
OnlineCounter.doUser(event.getValue(),false);# D  U. m# w7 T, h9 ~6 X7 k
} catch (Exception e)6 o# U0 _) }4 X$ h. L
{$ [% m7 b! P8 I  Q1 B
e.printStackTrace();6 `1 |% U3 n1 {- M
}
9 m+ {8 ~; ^% [}
& q! i2 G" h1 f) u  u( I* D}
  l& e% ~* v3 m5 Epublic void attributeRemoved(HttpSessionBindingEvent event)6 s3 m* s+ A6 r8 l: k2 J4 B
{5 O; i% E0 @, P% Z$ J) F( p6 ~
if (event.getName().equals(“userid”))1 x2 U2 V' u/ \+ l: S
{
+ N. f0 h1 p4 p( Y% |7 I+ Ctry
' H/ K  c( T5 C5 H. q5 V2 ?1 ^{
; Q& g7 t4 g. `1 POnlineCounter.doUser(event.getValue(),true);2 b1 |% W* L" g, U" m+ X' ?' `
} catch (Exception e)
; D) v: G8 G/ i: u$ y7 ~{- F6 {0 t3 `2 G2 E* q  t
e.printStackTrace();
' y5 a# B9 }% {9 F  h) ?0 T& i2 E}
0 ]+ h4 C2 y4 L* A}% x0 U2 \! i1 h. `6 N
}
  T7 s5 r4 X" @- ^public void attributeReplaced(HttpSessionBindingEvent event)* L6 Z0 }1 Z  r; _+ F
{( y/ ^+ {+ t4 T$ l
}  g( i% R2 V2 x" b$ q4 E; }
}
: h( p, g" l3 }8 m) r; m# J) u) W2、要做的就是实现任务类OnlineCounter了% K  X2 Y* ]( A% [+ d& E
public class OnlineCounter+ v, Z8 d" O, x4 x. I  C, Z
{
& I: q5 X/ v- p& qprivate static List list = new ArrayList();
1 p5 `' T2 ~) A/ x- k- p% j7 z6 |private static List list1 = new ArrayList();
' E# i5 l. l, `private OnlineCounter() {+ J9 s" v& @8 _2 ~
}2 c6 V$ E, h. p. n) k: Q" B; _
// 统计当前在线会员人数
/ j6 Z8 E9 J; p  _public static void doUser(Object object,boolean bl) {
: l; v0 c; R* B- K//得到用户当前访问时间7 M  j" t& j7 x$ P' S! s
String nowtime = getTime(“mm:ss”);
# Y$ S: Y3 M9 K2 }//Str数组用来存放用户的id和访问时间8 {) y% W! E' O" T/ H

7 W* c# ~( R2 xString[] str = new String[2];
; [1 o+ x9 O8 o  r1 gstr[0] = object.toString();/ J7 r/ l+ X9 R$ n
str[1] = nowtime;; i- G6 m+ |* p3 m. m7 Z4 J+ o1 m' A
//temp数组用来临时存放从list里面取出的用户的id和访问时间% {3 L6 t9 Z( s. {' \
String[] temp = new String[2];
+ L  V! F3 i# y8 v//循环list
* H3 x% n, C: K; A( Tfor (int i = 0; i 《 list.size(); i++) {
; ?" Z! l- I1 U) s" Rtemp = (String[])list.get(i);3 E( d. p# n3 q7 x; \
//如果从list里面取出的用户ip和str里面存放的id相同,则更新访问时间1 c0 J1 w7 H2 J" C. a8 \
if(bl==false && temp[0].equals(str[0])) {
# C% C# c8 S+ `  r& P+ nlist.set(i,str);3 Y5 t# j# y! z% k
return;& N* n. d+ ?0 Z4 {
}: f# C( S# v4 k6 P) j$ y
//如果监听类中穿过来bl==true,则认为不在线' @6 [' ]% u# d$ E& y
if(bl==true && temp[0].equals(str[0]))
' e$ F$ }  N2 C. ~! Y( X, V9 G1 J{* R5 e8 u9 R2 ?& R+ J. C
list.remove(i);+ z; U) D, F5 X% V/ D
}  Q/ A& b, n* w$ x# c
}
0 `1 w* D  ^' V2 K  m; i% ]3 x//添加一个新的在线用户
/ L4 @+ W) R' f/ r0 N. \if(bl==false)5 Q) p. Q6 u% n8 j8 I4 y
list.add(str);
5 o4 n4 `6 {" C; S//释放资源& T2 Y0 K7 m; z, L. X
str = null;temp = null;
! r3 c- Q1 \2 q- [}7 u1 }& y$ a# B( Y
//统计网站所有在线人数: v- f* h3 m0 b" f' j# k" S
public static void allUser(Object object) {
9 V9 z+ l5 d0 C6 v; {//得到用户当前访问时间
; S% `, u0 G0 B. a/ f" U; S. @String nowtime = getTime(“mm:ss”);
* E; G3 L' I0 ?' o! _7 i//Str数组用来存放用户得ip和访问时间
7 P$ D, l$ t. o( h- I' w1 _, R- zString[] str = new String[2];! K+ ]" q8 E& Y* v! W& z; x& U
str[0] = object.toString();
- |5 r8 H4 M- `- z2 [5 y# n7 s$ Lstr[1] = nowtime;) Q. G$ n+ I* |
//temp数组用来临时存放从list里面取出的用户ip和访问时间
* c0 c8 l7 H: p6 A; g0 a1 D( `" c/ x& WString[] temp = new String[2];6 F- ^% e, B5 r) G
//循环list" z. [$ A& H0 A2 _- ?" u( p, J
for (int i = 0; i 《 list1.size(); i++) {
$ r* R( j% E* P: F, D/ s" V$ j8 B& \temp = (String[])list1.get(i);
* y3 X  G: U, R) Z2 I) Y5 D, w//如果从list里面取出的用户ip和str里面存放的ip相同,则更新访问时间2 G$ z/ D( Y/ g
if( temp[0].equals(str[0])) {2 y6 D2 M$ |: E8 g. ^
list1.set(i,str);# n8 F, U  E; t  c3 M1 Z
return;
0 P/ d2 H- v3 v6 e2 K}# I0 \# w$ J) g: z  C6 d
//如果用户超过10分钟没有访问,则认为不在线
4 c4 F. Y" O6 ?  z0 kif(subTime(nowtime,temp[1]) 》 600)
' X- g4 e5 U, t{% l" B* B" u3 R/ h/ b& k# q
//System.out.print(“清空list过期的值”+i);# M% C# b4 k( V2 K- L
list1.remove(i);, n, N( x/ x! W
}
' j4 r+ g2 L* {9 }2 p. F9 z0 T}
* W+ `+ R# V$ b, [//添加一个新的在线用户
! j7 ^* T3 Z# h$ q/ Clist1.add(str);4 x: a3 q/ S8 i. l6 F, R+ i9 R
//释放资源
4 \1 k, m, O( {; k4 j, kstr = null;temp = null;9 _6 W1 H& }3 f+ c
}! h1 I8 }- w; {- ]+ s4 j4 b" v) R
public static int getOnlineAllCount() {; q* l$ |0 i2 M! ~! A  {% ^/ P$ @- C
//返回当前在线人数
( R6 c( |6 [. r3 _, ^, Wreturn list1.size();$ V1 X$ k; x7 l+ j. b* S
}9 ]- w8 t9 ^* W( e9 g$ `7 e# }
public static int getOnlineCount() {
! e: O: h3 @" F- i5 n1 Q( }//返回当前在线人数/ K7 U. c1 Z  a" c
return list.size();
9 O5 k# A5 p6 C2 q: a}: N) _2 o( q# P
/*public static void romovelist()% G  `, {0 t) a3 L
{: H0 J! Y0 W$ D' |9 ]# k
}*/
5 Q% @7 t$ D0 l% ~8 f2 d  i* _public static List getOnline() {
+ h' Z2 n3 `) F! ^. F7 ?( U# Zreturn list;
. \% F; v8 F) i/ o( z}5 s' D  u, W+ q
/** 计算两个时间差,返回相差秒数 */
- H& y! y' H2 s4 tpublic static int subTime(String src,String des) {* t3 L9 t$ |4 A6 p5 X$ d) s
int n = 0;6 b: ^% l6 p0 a2 G
java.util.Calendar ca = java.util.Calendar.getInstance();
* m# B& I6 C9 F. I2 ylong time1 =compareStringTime(src,des,“mm:ss”);3 r: d" L. q& Z$ B
ca.setTimeInMillis(time1);
) T5 H( Z# M2 g7 ^' Un = (ca.get(java.util.Calendar.MINUTE)) * 60;0 I# A4 ]" p' ?. X; D6 ^
n = n + ca.get(java.util.Calendar.SECOND);
8 q7 A# [+ W; p6 F2 |return n;
7 a0 U6 ?+ j8 ]2 C( X}( K) D( x3 }1 p5 [6 p: A7 g
/**
4 Q) K1 h6 L/ s0 M2 G9 D* 获得当前时间# U; p  V0 q6 P9 B, c
* @param parrten 输出的时间格式5 T8 J) X' i2 c8 I1 a* B, B2 e" k
* @return 返回时间* F' {( {8 G$ d$ t- F: b2 E
*/& O) Z& s( k( p! H: s, ~
4 g! o% Y0 v' m$ W
public static String getTime(String parrten)2 N6 n  I- I! ^1 V* G+ T" G
{$ I: p" R0 t0 X
String timestr;
1 a$ E1 Q9 _6 r9 R% C6 S+ hif(parrten==null||parrten.equals(“”))$ I; m3 u1 k( X9 C0 ?( D* a
{
8 p: ?* v6 O+ {9 ]" k# Wparrten=“yyyyMMddHHmmss”;
3 B" J5 t- y/ o( z( c7 L3 ?}% X9 A! l7 I! `. I. v% S$ G
java.text.SimpleDateFormat sdf=new SimpleDateFormat(parrten);
8 J- G0 l: I9 g9 U! @7 E( \java.util.Date cday=new Date();
& R6 e0 H9 X1 H9 w; o- htimestr=sdf.format(cday);
9 @, {+ h& X+ |0 f0 h" k& kreturn timestr;  f) ^" ?2 y% V4 O
}+ ^' Y* b; W/ ^& c& E
/**9 I: G* [/ ^$ P9 a; B
* 比较两个字符串时间的大小+ K) p' f, @( b+ F
* @param t1 时间1
( z  A: U* p7 e5 B/ L9 ^; a* @param t2 时间2
8 z; e) Y. b! c9 E5 Y* @param parrten 时间格式 :yyyy-MM-dd* `0 m4 w/ X. l- a
* @return 返回long =0相等,》0 t1》t2,《0 t1《t2
; h  P# T4 I0 Z1 o) z8 e*/
2 b+ b4 _9 l, l  opublic static long compareStringTime(String t1,String t2,String parrten)3 p& Q' g2 M, c: N: ~' p. {
{9 d* @9 O; U0 G7 B7 ~  D
SimpleDateFormat formatter = new SimpleDateFormat (parrten);
2 Q! E* k8 G% ]0 a: [" KParsePosition pos = new ParsePosition(0);
* W  W3 k  \! v; VParsePosition pos1 = new ParsePosition(0);& c" B8 E! y" V) a3 ^' V. y6 J
Date dt1=formatter.parse(t1,pos);, w: o0 }$ n) X; A: L- r5 X0 u
Date dt2=formatter.parse(t2,pos1);6 f2 M* |7 n6 x3 p
long l=dt1.getTime()-dt2.getTime();
& F7 f, Z. N' Treturn l;
9 T- Z- c1 E/ ^}
  I" f; T" d: p4 ~& t}+ M8 E5 q+ p9 o8 M7 o
3、在web。xml中配置监听类
+ R) R* |- M+ S, g《!-- online user --》& r1 k( B0 V5 S; ]
《listener》: ]/ m2 R" Z9 j8 c3 ]1 K" E
《listener-class》baby.com.common.SessionListener《/listener-class》* n0 n  W2 I% k* I
《/listener》
3 Z8 ?+ b" r6 @+ G最后就是在访问页面调用类中的alluser方法来实现统计在线人数就可以了; }3 A7 R* ~, X! T! `* a) I
String ip=“”;
+ P* T; n$ b- ^, j9 u( B; R9 kif (request.getHeader(“x-forwarded-for”) == null)
4 Z6 f$ G3 m) U1 u7 j{
( e  e8 J- o2 kip= request.getRemoteAddr();
" j1 Z/ X" B/ n  H& g3 q}1 F0 ^4 v7 c: z% v0 @1 x
else
) t4 w3 d) p/ T$ G2 Q7 Q{
- x! Z- V# v+ e9 `ip=request.getHeader(“x-forwarded-for”);
  Q# r; A& `, o3 }! d9 ?" n4 ?}8 B( Z7 m, c/ V/ g6 K
OnlineCounter.allUser(ip);
: _* b& z( s6 w' p, O5 \/ H这样就完成了 在线统计功能。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-4-19 04:43 , Processed in 0.204138 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表