JavaWeb中的Session、SessionListener、在线人数统计
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
JavaWeb中的Session- 在JavaWeb中使用HttpSession(以下簡稱session)對象來表示一個(gè)會(huì)話。
正在裝載數(shù)據(jù)…… - Session的創(chuàng)建(代表會(huì)話周期的開始):第一次調(diào)用request.getSession()方法時(shí),會(huì)創(chuàng)建一個(gè)session對象。
- Session的銷毀(代表會(huì)話周期的結(jié)束):在某個(gè)請求周期內(nèi)調(diào)用了Session.invalidate()方法,此請求周期結(jié)束后,session被銷毀;或者是session超時(shí)后自動(dòng)銷毀。
- 對于JSP,如果指定了<%@ page session="false"%>,則在JSP中無法直接訪問內(nèi)置的session變量,同時(shí)也不會(huì)主動(dòng)創(chuàng)建session,因?yàn)榇藭r(shí)JSP未自動(dòng)執(zhí)行request.getSession()操作獲取session。
- 在session對象剛創(chuàng)建的第一個(gè)請求周期內(nèi),調(diào)用session.isNew()方法將得到true。
- 可以在web.xml文件中配置session默認(rèn)的超時(shí)時(shí)間(分鐘):
< session-config >
???? < session-timeout > 10 session-timeout >
session-config > 也可以調(diào)用session. setMaxInactiveInterval()方法設(shè)置session超時(shí)時(shí)間(分鐘)
SessionListener
- 通過SessionListenr可以監(jiān)聽session的創(chuàng)建和銷毀,步驟:
1.寫一個(gè)類MySessionListener,實(shí)現(xiàn)javax.servlet.http.HttpSessionListener接口及其sessionCreated()、sessionDestroyed()方法
2.在web.xml中配置SessionListener:
< listener >
???? < listener-class > MySessionListener類全名 listener-class >
listener > - 當(dāng) session被創(chuàng)建和銷毀時(shí),容器會(huì)分別調(diào)用SessionListener的sessionCreated()方法和 sessionDestroyed()方法,這兩個(gè)方法中傳入了一個(gè)參數(shù)對象HttpSessionEvent,可以通過此對象的 getSession()方法獲取session對象。
應(yīng)用:在線人數(shù)統(tǒng)計(jì)
import java.util.HashSet;import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MySessionListener implements HttpSessionListener {
??????? public void sessionCreated(HttpSessionEvent event) {
?????????????? HttpSession session = event.getSession();
?????????????? ServletContext application = session.getServletContext();
??????????????
?????????????? // 在application范圍由一個(gè)HashSet集保存所有的session
?????????????? HashSet sessions = (HashSet) application.getAttribute( " sessions " );
?????????????? if (sessions == null ) {
????????????????????? sessions = new HashSet();
????????????????????? application.setAttribute( " sessions " , sessions);
?????????????? }
??????????????
?????????????? // 新創(chuàng)建的session均添加到HashSet集中
?????????????? sessions.add(session);
?????????????? // 可以在別處從application范圍中取出sessions集合 ????????????? // 然后使用sessions.size()獲取當(dāng)前活動(dòng)的session數(shù),即為“在線人數(shù)”
??????? }
??????? public void sessionDestroyed(HttpSessionEvent event) {
?????????????? HttpSession session = event.getSession();
?????????????? ServletContext application = session.getServletContext();
?????????????? HashSet sessions = (HashSet) application.getAttribute( " sessions " );
??????????????
?????????????? // 銷毀的session均從HashSet集中移除
?????????????? sessions.remove(session);
??????? }
}
?
?
package stat;
import javax.servlet.http.HttpServlet;??
import javax.servlet.http.HttpSessionAttributeListener;??
import javax.servlet.http.HttpSessionBindingEvent;??
import javax.servlet.http.HttpSessionBindingListener;??
import javax.servlet.http.HttpSessionEvent;??
import javax.servlet.http.HttpSessionListener;??
public class OnlineCounter extends HttpServlet implements HttpSessionListener,??
??? HttpSessionAttributeListener,HttpSessionBindingListener {??
public OnlineCounter(){??
??? System.out.println("OnlineCounter initialized.");??
}??
private static final long serialVersionUID = 1L;??
private static int sessionCounter = 0;??
private static int attributeCounter = 0;??
public void sessionCreated(HttpSessionEvent se) {??
??? sessionCounter++;??
??? System.out.println("session created:" + sessionCounter);??
}??
public void sessionDestroyed(HttpSessionEvent se) {??
??? sessionCounter--;??
??? System.out.println("session destroied");??
}??
public void attributeAdded(HttpSessionBindingEvent se) {??
??? attributeCounter++;??
??? System.out.println("attribute added :" + attributeCounter);??
}??
public void attributeRemoved(HttpSessionBindingEvent se) {??
??? attributeCounter--;??
??? System.out.println("attribute removed");??
}??
public void attributeReplaced(HttpSessionBindingEvent se) {??
??? System.out.println(se.getName()+" replaced");??
}??
????
public void valueBound(HttpSessionBindingEvent event){??
????? System.out.println(event.getName()+"_Bound_"+event.getValue());??
}??
public void valueUnbound(HttpSessionBindingEvent event) {??
??? System.out.println(event.getName()+"_Unbound_"+event.getValue());??
}??
public static int getOnlineSession() {??
??? return sessionCounter;??
}??
public static int getOnlineAttribute() {??
??? return attributeCounter;??
}??
}??
?
統(tǒng)計(jì)在線人數(shù)..sessionCreated中添加ip判斷
package com.asiainfo.sale.common;
import javax.servlet.http.*;
import javax.servlet.ServletException;
import java.io.IOException;
import java.util.Date;
import java.util.ArrayList;
import java.sql.Timestamp;
import javax.servlet.ServletRequestListener;
import javax.servlet.ServletRequestEvent;
public class SessionCounter implements HttpSessionListener,ServletRequestListener {
??? private static final String CONTENT_TYPE = "text/html; charset=GBK";
??? private static int activeSessions = 0;
??? private HttpServletRequest request;
??? private static ArrayList list = new ArrayList();
??? public void init() throws ServletException {
??? }
??? public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
??????? response.setContentType(CONTENT_TYPE);
??????? HttpSession session = request.getSession();
??? }
??? public void destroy() {
??? }
??? public void requestDestroyed(ServletRequestEvent event) {
??????? //To change body of implemented methods use File | Settings | File Templates.
??? }
??? public void requestInitialized(ServletRequestEvent sre){
??????? request=(HttpServletRequest)sre.getServletRequest();
??? }
??? public void sessionCreated(HttpSessionEvent httpSessionEvent) {
??????? String sessionId = httpSessionEvent.getSession().getId();
??????? Timestamp createTime = new Timestamp(System.currentTimeMillis());
??????? String loginIp = request.getRemoteAddr();
??????? boolean rs = true;
??????? if(list.size() > 0){
??????????? for(int i = 0;i < list.size(); i ++){
??????????????? if(loginIp.equals(list.get(i))){
??????????????????? rs = false;
??????????????? }
??????????? }
??????? }
??????? if(rs){????????????????????? //如果隊(duì)列中存在相同的IP 則SESSION不增加
??????????? list.add(loginIp);
??????????? System.out.println("ipList隊(duì)列新增ip: "+loginIp);
??????????? activeSessions++;
??????????? System.out.println("新增SESSION,sessionId = " + sessionId +"; createTime = " + createTime
???????????????????????????? + "; loginIp = " + loginIp +"; 當(dāng)前總SESSION值為 "+activeSessions);
??????? }
??? }
??? public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
??????? String sessionId = httpSessionEvent.getSession().getId();
??????? Timestamp overTime = new Timestamp(System.currentTimeMillis());
??????? String loginIp = request.getRemoteAddr();
??????? if(activeSessions>0){
??????????? if(list.size() > 0){
??????????????? for(int i = 0;i < list.size(); i ++){
??????????????????? if(loginIp.equals(list.get(i))){
??????????????????????? list.remove(i);??
??????????????????????? System.out.println("ipList隊(duì)列移除ip: "+loginIp);
??????????????????? }
??????????????? }
??????????? }
??????????? activeSessions--;?????????????????? //在用戶銷毀的時(shí)候,從隊(duì)列中踢出這個(gè)IP
??????????? System.out.println("銷毀SESSION,sessionId = " + sessionId +"; overTime = " + overTime
???????????????????????????? + "; loginIp = " + loginIp +"; 當(dāng)前總SESSION值為 "+activeSessions);
??????? }
??? }
??? public static int getActiveSessions() {
??????? return activeSessions;
??? }
??? public void setActiveSessions(int i) {
??????? activeSessions = i;
??? }
}
“七”樂無窮,盡在新浪新版博客,快來體驗(yàn)啊~~~請點(diǎn)擊進(jìn)入~
轉(zhuǎn)載于:https://my.oschina.net/snowsalt/blog/3508
總結(jié)
以上是生活随笔為你收集整理的JavaWeb中的Session、SessionListener、在线人数统计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谈谈关于MVP模式中V-P交互问题
- 下一篇: 关于商品分类 商品表和属性表的设计