JavaWeb中的Session、SessionListener、在线人数统计
跟我学J2EE Web监听器组件——统计计算在线用户数量的应用实例
1.1统计计算在线用户数量的监听器例1、本实例的应用背景在网站中经常需要进行在线人数的统计。
过去的一般做法是结合登录和退出功能,即当用户输入用户名密码进行登录的时候计数器加1,然后当用户点击退出按钮退出系统的时候计数器减1。
这种处理方式存在一些缺点,例如:用户正常登录后,可能会忘记点击退出按钮,而直接关闭浏览器,导致计数器减1的操作没有及时执行;网站上还经常有一些内容是不需要登录就可以访问的,在这种情况下也无法使用上面的方法进行在线人数统计。
我们可以利用Servlet规范中定义的事件监听器(Listener)来解决这个问题,实现“更准确”的在线人数统计功能。
2、HttpSessionListener事件监听器对每一个正在访问的用户,J2EE应用服务器会为其建立一个对应的HttpSession对象。
当一个浏览器第一次访问网站的时候,J2EE应用服务器会新建一个HttpSession对象,并触发HttpSession创建事件,如果注册了HttpSessionListener事件监听器,则会调用HttpSessionListener事件监听器的sessionCreated方法。
相反,当这个浏览器访问结束超时的时候,J2EE应用服务器会销毁相应的HttpSession对象,触发HttpSession销毁事件,同时调用所注册HttpSessionListener事件监听器的sessionDestroyed方法。
3、实现的基本原理可见,对应于一个用户访问的开始和结束,相应的有sessionCreated方法和sessionDestroyed 方法执行。
这样,我们只需要在HttpSessionListener实现类的sessionCreated方法中让计数器加1,在sessionDestroyed方法中让计数器减1,就轻松实现了网站在线人数的统计功能。
4、编程实现----实现对HttpSessionListener事件监听器程序(1)在项目中添加一个HttpSessionListener事件监听器程序类类名称为OnLineCounterListener ,包名称为com.px1987.webcrm.listener,实现HttpSessionListener、javax.servlet.http.HttpSessionAttributeListener接口(2)将产生出下面的程序结果(3)编程该程序package com.px1987.webcrm.listener;import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;import erInfoVO;import com.px1987.webcrm.util.OnLineCounter;public class OnLineCounterListener implements HttpSessionListener, HttpSessionAttributeListener {public OnLineCounterListener() {}@Overridepublic void sessionCreated(HttpSessionEvent arg0) {OnLineCounter.incrementCounter();}@Overridepublic void sessionDestroyed(HttpSessionEvent arg0) {OnLineCounter.reduceCounter();}@Overridepublic void attributeAdded(HttpSessionBindingEvent event) {if("oneUserInfoVO".equals(event.getName())){UserInfoVO oneUserInfoVO=(UserInfoVO)event.getValue();OnLineCounter.addOneUserInfoVOToList(oneUserInfoVO);}}@Overridepublic void attributeRemoved(HttpSessionBindingEvent event) { if("oneUserInfoVO".equals(event.getName())){UserInfoVO oneUserInfoVO=(UserInfoVO)event.getValue();OnLineCounter.removeOneUserInfoVOFromList(oneUserInfoVO);}}@Overridepublic void attributeReplaced(HttpSessionBindingEvent arg0) {}}由于session监听的是HTTP连接,只要有用户与server连接,就算连接的是一个空白的jsp页面,也会触发session事件,所以此处的session实际上指的是connection。
HttpsessionListener实现在线人数统计
HttpsessionListener实现在线⼈数统计最近在学servlet jsp,⽤的林信良先⽣的 jsp&servlet 这本书,在第五章有道在线⼈数统计的课后题完成,做⼀次记录.实际效果:⼀:⽤户类:1package cc.openhome.controler;23public class User {4private String name;5private String sessionId;6private String ip;7private String firstTime;8private String userAgent;9public User(){1011 }1213public String getName() {14return name;15 }1617public String getIp() {18return ip;19 }2021public String getSessionId() {22return sessionId;23 }2425public String getFirstTime() {26return firstTime;27 }2829public String getUserAgent() {30return userAgent;31 }3233public void setUserAgent(String userAgent) {erAgent = userAgent;35 }3637public void setName(String name) { = name;39 }4041public void setFirstTime(String firstTime) {42this.firstTime = firstTime;43 }4445public void setIp(String ip) {46this.ip = ip;47 }4849public void setSessionId(String sessionId) {50this.sessionId = sessionId;51 }5253 }public class User⼆:登录页⾯:1package cc.openhome.controler;23import javax.servlet.ServletException;4import javax.servlet.annotation.WebServlet;5import javax.servlet.http.Cookie;6import javax.servlet.http.HttpServlet;7import javax.servlet.http.HttpServletRequest;8import javax.servlet.http.HttpServletResponse;9import java.io.IOException;10import java.text.SimpleDateFormat;11import java.util.*;1213 @WebServlet("/login.do")14public class Login extends HttpServlet {1516private ArrayList<User> ulist;17private Map<String,String> users;18public Login(){19 users = new HashMap<String,String>();20 users.put("liming","123456");21 users.put("⼩猪","123456");22 users.put("⼩林","123456");23 }2425 @Override26protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 2728 req.setCharacterEncoding("UTF-8");29 String uname = req.getParameter("user");30 String pssd = req.getParameter("pwd");3132 String page = "login.html";3334if (users.containsKey(uname) && users.get(uname).equals(pssd)) {35 req.getSession().setAttribute("uname", uname);36 String sessionId = req.getSession().getId();37 ArrayList<User> ulist = (ArrayList<User>) getServletContext().getAttribute("ulist");38if(ulist == null){39 ulist = new ArrayList<User>();40 getServletContext().setAttribute("ulist",ulist);41 }42 User u = new User();43 u.setSessionId(sessionId);44 u.setName(uname);45 u.setIp(req.getRemoteAddr());46 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:MM:ss");47 u.setFirstTime(df.format(new Date()));48 u.setUserAgent(req.getHeader("user-agent"));49 ulist.add(u);50 page = "welcome.view";51 }52 resp.sendRedirect(page);53 }54 }三:统计在线⼈数:1package cc.openhome.controler;24import javax.servlet.ServletContext;5import javax.servlet.annotation.WebListener;6import javax.servlet.http.HttpSession;7import javax.servlet.http.HttpSessionEvent;8import javax.servlet.http.HttpSessionListener;9import java.util.List;1011 @WebListener12public class OnlineUserCounter implements HttpSessionListener {13private static int counter;1415public static int getCounter(){16return counter;17 }1819 @Override20public void sessionCreated(HttpSessionEvent se) {21 System.out.println("新建session: "+se.getSession().getId());2223 }2425 @Override26public void sessionDestroyed(HttpSessionEvent se) {27 HttpSession session = se.getSession();28 ServletContext application = session.getServletContext();29 String username = (String) session.getAttribute("username");3031 List ulist = (List)32 application.getAttribute("ulist");33 ulist.remove(username);34 System.out.println(username+"已经退出!");3536 }37 }四:登录成功页⾯显⽰1package cc.openhome.view;23import er;4import cc.openhome.controler.OnlineUserCounter;5import javax.servlet.ServletException;6import javax.servlet.annotation.WebServlet;7import javax.servlet.http.HttpServlet;8import javax.servlet.http.HttpServletRequest;9import javax.servlet.http.HttpServletResponse;10import javax.servlet.http.HttpSession;11import java.io.IOException;12import java.io.PrintWriter;13import java.util.ArrayList;14import java.util.Iterator;15import java.util.List;1617 @WebServlet("/welcome.view")18public class Welcome extends HttpServlet {19 @Override20protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 2122 resp.setContentType("text/html;charset=UTF-8");23 PrintWriter out = resp.getWriter();24 HttpSession session = req.getSession(false);25 out.println("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01'" +26 "Transitional//EN");27 out.println("<html>");28 out.println("<head>");29 out.println("<title>欢迎</title>");30 out.println("</head>");31 out.println("<body>");3233 ArrayList<User> ul = (ArrayList <User>) getServletContext().getAttribute("ulist");34 out.println("<h1> ⽬前在线⼈数 "+ ul.size() +"⼈</h1>");35 Iterator<User> it = ul.iterator();36while (it.hasNext()){37 User u = it.next();38 out.println("<h4>id: "+ u.getSessionId() +" </h4>");39 out.println("<h4>⽤户: "+ u.getName()+" </h4>");40 out.println("<h4>ip: "+ u.getIp() +" </h4>");41 out.println("<h4>访问时间: "+ u.getFirstTime() +" </h4>");42 out.println("<h4>浏览器信息: "+ u.getUserAgent() +" </h4>");43 out.println("<br>");44 }4546 out.println("</body>");47 out.println("</html>");48 out.close();4950 }51 }五:登录的前端页⾯:1<!DOCTYPE html>2<html lang="en">3<head>4<meta charset="UTF-8">5<title>登录</title>6</head>7<body>8<form action="login.do" method="post">9⽤户名: <input type="text" name="user"><br>10密码: <input type="password" name="pwd"><br>11提交: <input type= "submit">12</form>13</body>14</html>longin.html六:实际效果:七:总结1.httpsessionListener ⼯作机制2,ArrayList 使⽤⼋:不⾜之处:1页⾯展⽰⽤的是:在servlet中⽤的html,还没有学习jsp.2.已知问题:同⼀个⽤户同时登录,重新显⽰为⼀新⽤户,后⾯再改参考资料:本⼈菜鸟⼀枚,如有问题请⼤神不吝赐教!。
javaWeb基础知识----Cookie,Session
javaWeb基础知识----Cookie,Session •HTTP协议是一种无状态的协议,WEB服务器本身不能识别出哪些请求是同一个浏览器发出的,浏览器的每一次请求都是完全孤立的•即使HTTP1.1支持持续连接,但当用户有一段时间没有提交请求,连接也会关闭。
•怎么才能实现网上商店中的购物车呢:某个用户从网站的登录页面登入后,再进入购物页面购物时,负责处理购物请求的服务器程序必须知道处理上一次请求的程序所得到的用户信息。
•作为web 服务器,必须能够采用一种机制来唯一地标识一个用户,同时记录该用户的状态1.会话和会话状态•WEB应用中的会话是指一个客户端浏览器与WEB服务器之间连续发生的一系列请求和响应过程。
•WEB应用的会话状态是指WEB服务器与浏览器在会话过程中产生的状态信息,借助会话状态,WEB服务器能够把属于同一会话中的一系列的请求和响应过程关联起来。
2.如何实现有状态的会话•WEB服务器端程序要能从大量的请求消息中区分出哪些请求消息属于同一个会话,即能识别出来自同一个浏览器的访问请求,这需要浏览器对其发出的每个请求消息都进行标识:属于同一个会话中的请求消息都附带同样的标识号,而属于不同会话的请求消息总是附带不同的标识号,这个标识号就称之为会话ID(SessionID)。
•在Servlet规范中,常用以下两种机制完成会话跟踪–Cookie–Session一、Cookie[java] view plain copy 在CODE上查看代码片派生到我的代码片/*** @author changwen on 2016/11/13.*/import java.io.Serializable;import java.text.MessageFormat;import java.util.Locale;import java.util.ResourceBundle;public class Cookie implements Cloneable, Serializable {private static final long serialVersionUID = -6454587001725327448L;private static final String TSPECIALS;private static final String LSTRING_FILE = "javax.servlet.http.LocalStrings";private static ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.http.LocalStrings");private String name; //这个只有get方法/*下面几个属性都只有简单get,set方法*/private String value;private String comment;private String domain; //这个set方法有处理过private int maxAge = -1;private String path;private boolean secure;private int version = 0;//需要了解,boolean类型的get方法是这样子public boolean isHttpOnly() {return isHttpOnly;}private boolean isHttpOnly = false;public Cookie(String name, String value) {if(name != null && name.length() != 0) {if(this.isToken(name) && !name.equalsIgnoreCase("Comment") && !name.equalsIgnoreCase("Discard")&& !name.equalsIgnoreCase("Domain") && !name.equalsIgnoreCase("Expires")&& !name.equalsIgnoreCase("Max-Age") && !name.equalsIgnoreCase("Path")&& !name.equalsIgnoreCase("Secure") && !name.equalsIgnoreCase("Version")&& !name.startsWith("$")) { = name;this.value = value;} else {String errMsg = lStrings.getString("err.cookie_name_is_token");Object[] errArgs = new Object[]{name};errMsg = MessageFormat.format(errMsg, errArgs);throw new IllegalArgumentException(errMsg);}} else {throw new IllegalArgumentException(lStrings.getString("err.cookie_name_blank"));}}private boolean isToken(String value) {int len = value.length();for(int i = 0; i < len; ++i) {char c = value.charAt(i);if(c < 32 || c >= 127 || TSPECIALS.indexOf(c) != -1) {return false;}}return true;}public Object clone() {try {return super.clone();} catch (CloneNotSupportedException var2) {throw new RuntimeException(var2.getMessage());}}static {if(Boolean.valueOf(System.getProperty("org.glassfish.web.rfc2109_cookie_names_enforced", "true")).booleanValue()) {TSPECIALS = "/()<>@,;:\\\"[]?={} \t";} else {TSPECIALS = ",; ";}}public void setDomain(String domain) {this.domain = domain.toLowerCase(Locale.ENGLISH);}public String getDomain() {return this.domain;}public String getName() {return ;}}Servlet API中提供了一个javax.servlet.http.Cookie类来封装Cookie信息,它包含有生成Cookie信息和提取Cookie信息的各个属性的方法。
javaweb学习总结(四十七)——监听器(Listener)在开发中的应用
javaweb学习总结(四⼗七)——监听器(Listener)在开发中的应⽤ 监听器在JavaWeb开发中⽤得⽐较多,下⾯说⼀下监听器(Listener)在开发中的常见应⽤⼀、统计当前在线⼈数 在JavaWeb应⽤开发中,有时候我们需要统计当前在线的⽤户数,此时就可以使⽤监听器技术来实现这个功能了。
1package me.gacl.web.listener;23import javax.servlet.ServletContext;4import javax.servlet.http.HttpSessionEvent;5import javax.servlet.http.HttpSessionListener;67/**8* @ClassName: OnLineCountListener9* @Description: 统计当前在线⽤户个数10* @author: 孤傲苍狼11* @date: 2014-9-10 下午10:01:2612*13*/14public class OnLineCountListener implements HttpSessionListener {1516 @Override17public void sessionCreated(HttpSessionEvent se) {18 ServletContext context = se.getSession().getServletContext();19 Integer onLineCount = (Integer) context.getAttribute("onLineCount");20if(onLineCount==null){21 context.setAttribute("onLineCount", 1);22 }else{23 onLineCount++;24 context.setAttribute("onLineCount", onLineCount);25 }26 }2728 @Override29public void sessionDestroyed(HttpSessionEvent se) {30 ServletContext context = se.getSession().getServletContext();31 Integer onLineCount = (Integer) context.getAttribute("onLineCount");32if(onLineCount==null){33 context.setAttribute("onLineCount", 1);34 }else{35 onLineCount--;36 context.setAttribute("onLineCount", onLineCount);37 }38 }39 }⼆、⾃定义Session扫描器 当⼀个Web应⽤创建的Session很多时,为了避免Session占⽤太多的内存,我们可以选择⼿动将这些内存中的session销毁,那么此时也可以借助监听器技术来实现。
利用java监听器实现在线人数统计
利⽤java监听器实现在线⼈数统计本⽂实例为⼤家分享了java监听器实现在线⼈数统计的具体代码,供⼤家参考,具体内容如下1.在⼯程中创建监听类SessionListener 并且实现HttpSessionListener接⼝,代码如下import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;public class SessionListener implements HttpSessionListener {private static int count = 0;public void sessionCreated(HttpSessionEvent se) {count++;System.out.println("session创建:" + new java.util.Date());}public void sessionDestroyed(HttpSessionEvent se) {count--;System.out.println("session销毁:" + new java.util.Date());}public static int getCount() {return count;}}2.配置web.xml<listener><description>session监听器</description><listener-class>com.xxx.SessionListener</listener-class></listener>3.在JSP页⾯中显⽰在线⼈数<%int count=com.xxx.SessionListener.getCount();out.println("在线⼈数:"+count);%>注意:servlet中对session的监听有很多接⼝,功能很灵活,最常⽤的是监听Session和Attribute。
详解JavaWeb中的Listener
详解JavaWeb中的Listener⼀、基本概念JavaWeb⾥⾯的listener是通过观察者设计模式进⾏实现的。
对于观察者模式,这⾥不做过多介绍,⼤概讲⼀下什么意思。
观察者模式⼜叫发布订阅模式或者监听器模式。
在该模式中有两个⾓⾊:观察者和被观察者(通常也叫做主题)。
观察者在主题⾥⾯注册⾃⼰感兴趣的事件,当这个事件发⽣时,主题会通过回调接⼝的⽅式通知观察者。
举个⽣活中的例⼦:订阅报纸。
任何⼀个家庭或个⼈都可以向报社订阅报纸。
这⾥报社就是“主题”,家庭就是“观察者”。
⽐如家庭需要订阅明天早晨的报纸,这个就是“事件”。
到了第⼆天早晨,报纸⽣产出来了,这个就是“事件发⽣”。
当事件发⽣时,送报员将报纸送到家庭的信箱⾥⾯,这⾥的信箱就是“回调接⼝”。
对于JavaWeb⾥⾯的监听器,Servlet规范定义了⼀些列的Listener接⼝类,通过接⼝类的⽅式将事件暴露给应⽤程序,应⽤程序如果想监听其感兴趣的事件,那么不必去直接注册对应的事件,⽽是编写⾃⼰的listener实现相应的接⼝类,并将⾃⼰的listener注册到servlet容器。
当程序关⼼的事件发⽣时,servlet容器会通知listener,回调listener⾥⾯的⽅法。
这⾥⾃定义的listener就是观察者,servlet容器就是主题。
⼆、样例分析上⾯说了,servlet容器是通过Listener接⼝类将事件暴露给应⽤程序的。
所以我们与其说是注册事件,不如说是注册监听器。
对应到编程步骤就是:1.编写⾃⼰的listener,实现特定的Listener接⼝。
2.在web.xml⾥⾯注册⾃⼰的listener。
这⾥以最简单的监听器接⼝ServletContextListener举例:1.TestListener.javapublic class TestListener implements ServletContextListener {public TestListener() {}public void contextInitialized(ServletContextEvent sce) {System.out.println("ServletContextListener.contextInitialized");}public void contextDestroyed(ServletContextEvent sce) {System.out.println("ServletContextListener.contextDestroyed");}}2.web.xml<listener><listener-class>com.nantang.listener.TestListener</listener-class></listener>当容器启动时会向⽇志中输出"ServletContextListener.contextInitialized",当容器关闭时会输出"ServletContextListener.contextDestroyed"。
Java中Session的详解
Java中Session的详解1.什么是session: ·服务器会给每⼀个⽤户(浏览器)创建⼀个session对象 ·⼀个session独占⼀个浏览器,只要浏览器不关闭,这个session就⼀直存在 ·session称为会话控制,存储⽤户会话所需的属性和配置信息,这样,⽤户在应⽤程序的web页⾯跳转时,存储在session对象中的⽤户信息不会丢掷,⽽是在整个⽤户会话中⼀直保持下去2.session的经典应⽤场景: ·⼀个⽤户登陆后,访问该⽹站的其他⽹页时,⼀直处于登录状态 ·保存购物车信息等等3.session中常⽤的⽅法 ·getId():获取session的唯⼀标识 ·getServletContext():代表整个web服务 ·getAttribute(String):获取session的节点,⽐如你在其中⼀个Servlet中通过setAttribute(String,Object)配置了相关的session信息,然后通过另⼀个Servlet获取这个Servlet中的session信息,就要⽤到getAttribute(String)这个⽅法 ·setAttribute(String,Object):设置session节点 ·removeAttribute(String):⼀出⼀个session节点 ·isNew():判断⼀个session是否是⼀个新的session ·invalidate():注销session的4.例1:创建⼀个session并获取到session的ID,判断这个session是否是新的session ·步骤1:新建⼀个maven项⽬,使⽤webapp模板 ·步骤2:在Java⽂件夹下创建⼀个com.xiaoma.servlet.SessionDemo01的类,编写servlet类⽂件1package com.xiaoma.servlet;23import com.xiaoma.pojo.Person;5import javax.servlet.ServletException;6import javax.servlet.http.HttpServlet;7import javax.servlet.http.HttpServletRequest;8import javax.servlet.http.HttpServletResponse;9import javax.servlet.http.HttpSession;10import java.io.IOException;1112public class SessionDemo01 extends HttpServlet {13 @Override14protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {15//解决中⽂乱码16 resp.setHeader("content-type","text/html;charset=UTF-8");17//得到session18 HttpSession session = req.getSession();19//通过setAttribute⽅法向Session中存放信息20 session.setAttribute("name","⼩马");21//获取session相关信息,包括id,是否是新的session等22 String sessionId = session.getId();23if(session.isNew()) {24 resp.getWriter().write("创建Session成功,ID为:" + sessionId);25 }else{26 resp.getWriter().write("Session已经存在了,ID为:" + sessionId);27 }28 }2930 @Override31protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {32 doGet(req, resp);33 }34 } ·步骤2:配置XML⽂件1<servlet>2<servlet-name>SessionDemo01</servlet-name>3<servlet-class>com.xiaoma.servlet.SessionDemo01</servlet-class>4</servlet>5<servlet-mapping>6<servlet-name>SessionDemo01</servlet-name>7<url-pattern>/s1</url-pattern>8</servlet-mapping> 例2:从⼀个servlet中读取另⼀个servlet中的session信息 ·步骤1:在Java⽂件夹下创建⼀个com.xiaoma.servlet.SessionDemo01的类,编写servlet类⽂件1package com.xiaoma.servlet;23import com.xiaoma.pojo.Person;45import javax.servlet.ServletException;6import javax.servlet.http.HttpServlet;7import javax.servlet.http.HttpServletRequest;8import javax.servlet.http.HttpServletResponse;9import javax.servlet.http.HttpSession;10import java.io.IOException;1112public class SessionDemo01 extends HttpServlet {13 @Override14protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {15//解决中⽂乱码16 resp.setHeader("content-type","text/html;charset=UTF-8");17//得到session18 HttpSession session = req.getSession();19//通过setAttribute⽅法向Session中存放信息20 session.setAttribute("name","⼩马");21//获取session相关信息,包括id,是否是新的session等22 String sessionId = session.getId();23if(session.isNew()) {24 resp.getWriter().write("创建Session成功,ID为:" + sessionId);25 }else{26 resp.getWriter().write("Session已经存在了,ID为:" + sessionId);27 }28 }2930 @Override31protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {32 doGet(req, resp);33 }34 } ·步骤2:在Java⽂件夹下创建⼀个com.xiaoma.servlet.SessionDemo02的类,编写另⼀个⽤来读取的servlet类,通过SessionDemo02来读取SessionDemo01中的session信息1package com.xiaoma.servlet;23import com.xiaoma.pojo.Person;4import javax.servlet.ServletException;5import javax.servlet.http.HttpServlet;6import javax.servlet.http.HttpServletRequest;7import javax.servlet.http.HttpServletResponse;8import javax.servlet.http.HttpSession;9import java.io.IOException;1011public class SessionDemo02 extends HttpServlet {12 @Override13protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {14//解决中⽂乱码15 resp.setHeader("content-type","text/html;charset=UTF-8");16//得到session17 HttpSession session = req.getSession();18 String name=(String) session.getAttribute("name");19 resp.getWriter().write(name);20 }2122 @Override23protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {24super.doPost(req, resp);25 }26 } ·步骤3:配置xml⽂件1<servlet>2<servlet-name>SessionDemo02</servlet-name>3<servlet-class>com.xiaoma.servlet.SessionDemo02</servlet-class>4</servlet>5<servlet-mapping>6<servlet-name>SessionDemo02</servlet-name>7<url-pattern>/s2</url-pattern>8</servlet-mapping> 例3:session中还可以存放对象信息 ·步骤1:在Java⽂件夹下创建⼀个com.xiaoma.pojo.Person的类,编写我们的实体类1package com.xiaoma.pojo;23public class Person {4private String name;5private int age;67public Person() {8 }910public Person(String name, int age) { = name;12this.age = age;13 }1415public String getName() {16return name;17 }1819public void setName(String name) { = name;21 }2223public int getAge() {24return age;25 }2627public void setAge(int age) {28this.age = age;29 }3031 @Override32public String toString() {33return "Person{" +34 "name='" + name + '\'' +35 ", age=" + age +36 '}';37 }38 } ·步骤2:在Java⽂件夹下创建⼀个com.xiaoma.servlet.SessionDemo01的类,编写servlet类⽂件 1package com.xiaoma.servlet;23import com.xiaoma.pojo.Person;45import javax.servlet.ServletException;6import javax.servlet.http.HttpServlet;7import javax.servlet.http.HttpServletRequest;8import javax.servlet.http.HttpServletResponse;9import javax.servlet.http.HttpSession;10import java.io.IOException;1112public class SessionDemo01 extends HttpServlet {13 @Override14protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 15//解决中⽂乱码16 resp.setHeader("content-type","text/html;charset=UTF-8");17//得到session18 HttpSession session = req.getSession();19//通过setAttribute⽅法向Session中存放信息20 session.setAttribute("name",new Person("⼩马",18));21//获取session相关信息,包括id,是否是新的session等22 String sessionId = session.getId();23if(session.isNew()) {24 resp.getWriter().write("创建Session成功,ID为:" + sessionId);25 }else{26 resp.getWriter().write("Session已经存在了,ID为:" + sessionId);27 }28 }2930 @Override31protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {32 doGet(req, resp);33 }34 } ·步骤3:在Java⽂件夹下创建⼀个com.xiaoma.servlet.SessionDemo02的类,编写另⼀个servlet类⽂件,⽤来读取SessionDemo01中的Session对象信息1package com.xiaoma.servlet;23import com.xiaoma.pojo.Person;45import javax.servlet.ServletException;6import javax.servlet.http.HttpServlet;7import javax.servlet.http.HttpServletRequest;8import javax.servlet.http.HttpServletResponse;9import javax.servlet.http.HttpSession;10import java.io.IOException;1112public class SessionDemo02 extends HttpServlet {13 @Override14protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {15//获取session中的Person对象16//解决中⽂乱码17 resp.setHeader("content-type","text/html;charset=UTF-8");18//得到session19 HttpSession session = req.getSession();20 Person person=(Person) session.getAttribute("name");21 resp.getWriter().write(person.toString());22 }2324 @Override25protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {26super.doPost(req, resp);27 }28 } ·步骤4:编写xml⽂件,与上同理 例4:注销session(注销session有两种⽅式,⼀种是通过removeAttribute(String)⽅法,另⼀种是通过xml配置⽂件) ·第⼀种,通过removeAttribute(String)⽅法,这种⽅式是使session⼿动过期1package com.xiaoma.servlet;23import javax.servlet.ServletException;4import javax.servlet.http.HttpServlet;5import javax.servlet.http.HttpServletRequest;6import javax.servlet.http.HttpServletResponse;7import javax.servlet.http.HttpSession;8import java.io.IOException;910public class SessionDemo03 extends HttpServlet {11 @Override12protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {13//得到session14 HttpSession session = req.getSession();15//⼿动注销session16 session.removeAttribute("name");17 session.invalidate();18 }1920 @Override21protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {22super.doPost(req, resp);23 }24 } ·第⼆种,通过xml⽂件的⽅法,这种⽅式是时session⾃动过期1<!--设置session的存活时间-->2<session-config>3<!--以分钟为单位-->4<session-timeout>1</session-timeout>5</session-config>5.session与cookie的区别 ·(1)cookie是吧⽤户的数据写给浏览器,浏览器保存(可以保存多个) ·(2)session是把⽤户的数据写给⽤户独占的session中,服务器保存(保存重要信息,避免浪费服务器资源) ·(3)session是由服务器创建的。
java session的用法(一)
java session的用法(一)Java Session的用法Java中的Session是一种用于在Web应用程序中跟踪用户会话的机制。
它可以用来存储和检索用户的信息,以便在不同的页面之间共享数据。
本文将介绍一些Java Session的常见用法。
创建Session对象在Java中,可以通过以下方式来创建Session对象:1.使用()方法:这是最常见的创建Session对象的方式。
它会检查请求中是否存在Session,如果存在则返回该Session对象,否则会创建一个新的Session对象。
2.使用(true)方法:与上述方法相同,如果不存在Session对象,则会创建一个新的Session对象返回。
3.使用(false)方法:该方法会检查请求中是否存在Session,如果存在则返回该Session对象,如果不存在则返回null。
HttpSession session = (); // 创建Session对象设置和获取Session属性Session对象可以用来存储和获取用户的数据。
下面是一些常用的设置和获取Session属性的方法:设置Session属性可以使用(String name, Object value)方法来设置Session 属性,其中name为属性名,value为属性值。
("username", "John"); // 设置Session属性获取Session属性可以使用(String name)方法来获取Session属性的值,其中name为属性名。
String username = (String) ("username"); // 获取Se ssion属性Session的超时设置Session对象可以设置一个超时时间,用于控制Session的有效时间。
当用户在一定时间内没有与服务器进行交互时,Session会自动失效。
J2EE Web组件课程设计实训项目——《BBS论坛系统》——构建J2EE Listener监听器组件以实现显示在线用户总数
基于J2EE Web组件技术的课程设计实训项目——《BBS论坛系统》——构建J2EE Listener监听器组件以实现显示在线用户总数1.1.1添加Listener组件显示在线用户数1、添加一个在线用户计数的组件(1)类名称为OnLineCounter,包名称为com.px1987.webbbs.util(2)编程该OnLineCounter组件package com.px1987.webbbs.util;import java.util.*;import erInfoVO;import com.px1987.webbbs.listener.CounterOnLineVisitorListener;public class OnLineCounter{private static int onLine = 0;public static int getOnLine() {return onLine;}public static void addOneUser() {onLine++;}public static void reduceOneUser() {onLine--;}public static List getOnLineUserNameList(){Iterator onLineUserList=CounterOnLineVisitorListener.getOnLineUserList().iterator();List onLineUserNameList=new ArrayList();while(onLineUserList.hasNext()) {UserInfoVO oneLoginUserInfoVO=(UserInfoVO)onLineUserList.next();onLineUserNameList.add(oneLoginUserInfoVO.getUserName());}return onLineUserNameList;}public static int getOnLineMemberUserNumber() {return CounterOnLineVisitorListener.getOnLineUserList().size();}}2、添加CounterOnLineVisitorListener组件(1)类名称为CounterOnLineVisitorListener,包名称为com.px1987.webbbs.listener,并且实现javax.servlet.http.HttpSessionListener和HttpSessionAttributeListener等接口(2)部署该CounterOnLineVisitorListener组件<listener><listener-class>com.px1987.webbbs.listener.CounterOnLineVisitorListener </listener-class></listener>(3)编程该Listenerpackage com.px1987.webbbs.listener;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.ServletContext;import javax.servlet.http.HttpSessionAttributeListener;import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;import com.px1987.webbbs.util.OnLineCounter;import erInfoVO;import java.util.*;public class CounterOnLineVisitorListener implements HttpSessionListener, HttpSessionAttributeListener{private static List onLineUserList=new ArrayList();public void sessionCreated(HttpSessionEvent se){OnLineCounter.addOneUser();}public void sessionDestroyed(HttpSessionEvent se){OnLineCounter.reduceOneUser();}public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent){ //识别该用户是否已经登录if(httpSessionBindingEvent.getName().equals("oneUserInfoVO")) { UserInfoVO nowLoginUserInfo=(UserInfoVO)httpSessionBindingEvent.getValue();onLineUserList.add(nowLoginUserInfo);}}public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent){if(httpSessionBindingEvent.getName().equals("oneUserInfoVO")){UserInfoVO nowLoginUserInfo=(UserInfoVO)httpSessionBindingEvent.getValue();onLineUserList.remove(nowLoginUserInfo);}}public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent){}public static List getOnLineUserList(){return onLineUserList;}}3、在页面中定位显示计数的标签<SPAN class=bold><%=OnLineCounter.getOnLine()%> </SPAN><span class="bold">人在线 - <%=OnLineCounter.getOnLineMemberUserNumber()%> 位会员(0 隐身), <%=readWriteCookieBean.getOnLineGuestCounter()%>4、对每个页面的<body>标签添加onbeforeunload事件方法<SCRIPT language=JavaScript>function RunOnBeforeUnload(){window.location.href="/WebBBS/pageForwordAction.do?action=showUserLogoutForDWR";}</script><BODY leftMargin=0 topMargin=0 rightMargin=0onbeforeunload="RunOnBeforeUnload()"></BODY>在该事件方法中对后台发送浏览器窗口正在关闭的事件请求,从而使得后台能够知道浏览器窗口现在正在关闭。
servlet监听完成统计在线人数,显示在线人员列表(附源码)
String password = request.getParameter("password");
ServletContext application = this.getServletContext();//取得application对象
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public UserPOJO(int id, String username, String password) {
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
res.close();
pstate.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return user;
//取得application对象
application.setAttribute("allUser", list);
//将集合设置到application范围属性中去
}
public vSessionBindingEvent se) {
List<String> list = (List<String>)application.getAttribute("allUser");
《Java Web应用开发项目教程》第8章 使用监听器实现在线人数统计
计算机与软件学院
第8章 使用监听器实现在线人数统计
■本章要点:
Servlet监听器开发技术 在线人数统计功能模块设计与实现 Servlet监听器技术特性分析 Servlet监听器的典型应用
计算机与软件学院
8.1 使用Servlet监听器实现在线人数统计
■在线人数统计功能分析 在系统运行过程中,了解当前使用系统的用户,有多少人 在使用系统?具体又是哪些人在使用系统?
public void contextDestroyed(ServletContextEvent sce){ //应用程序卸载时启动}
public void sessionCreated(HttpSessionEvent se){ //当有用户访问时启动}
public void sessionDestroyed(HttpSessionEvent se){ //当有用户退出时启动}
计算机与软件学院
■Servlet监听器
8.2 servlet监听器知识总结
计算机与软件学院
8.2 servlet监听器知识总结
■Servlet上下文监听
1、ServletContextListener编程接口:“Web应用程序 的生命周期方法”。
• contextInitialized(ServletContextEvent event) 应用程序被加载及初始化时激发
计算机与软件学院
8.1.3 Servlet监听器技术特性分析
■监听域对象的创建、属性和改变和销毁
3.在ServletRequestListener接口: • public void requestInitialized(ServletRequestEvent
javaWeb在线用户统计
response.sendRedirect(request.getRequestURI());
return;
}
}else{
response.sendRedirect("index.jsp");
if(obj==null||!(obj instanceof PersonInfo)){
return false;
}
return username.equals(((PersonInfo)obj).getUsername());
import javax.servlet.http.HttpSessionEvent;
java web 在线用户统计
FilterAndListene 2011-02-16 17:24:24 阅读165 评论0 字号:大中小 订阅
看一下效果图先:
页面有点简陋,哈哈..大家将就着看吧,我美工不行啊,哈哈...
这个也是用了各种Listener实现的,看一下代码吧,相信一看都能明白了。
%>
<tr>
<td><%=id %></td>
<td><%=person==null ? " " : person.getUsername() %></td>
<td><%=DateFormat.getTimeInstance().format(sess.getCreationTime()) %></td>
JavaWeb的session及其共享技术
JavaWeb的session及其共享技术1.什么叫会话一次会话指的是:就好比打电话,A给B打电话,接通之后,会话开始,直到挂断电话,该次会话就结束了,而浏览器访问服务器,就跟打电话一样,浏览器A给服务器发送请求,访问web程序,该次会话就已经接通,其中不管浏览器发送多少请求(就相当于接通电话后说话一样),都视为一次会话,直到浏览器关闭,本次会话结束。
其中注意,一个浏览器就相当于一部电话,如果使用火狐浏览器,访问服务器,就是一次会话了,然后打开google浏览器,访问服务器,这是另一个会话,虽然是在同一台电脑,同一个用户在访问,但是,这是两次不同的会话。
2.引入cookie和session思考一个问题,一个浏览器访问一个服务器就能建立一个会话,如果别的电脑,都同时访问该服务器,就会创建很多会话,就拿一些购物网站来说,我们访问一个购物网站的服务器,会话就被创建了,然后就点击浏览商品,对感兴趣的商品就先加入购物车,等待一起付账,这看起来是很普通的操作,但是想一下,如果有很多别的电脑上的浏览器同时也在访问该购物网站的服务器,跟我们做类似的操作呢?服务器又是怎么记住用户,怎么知道用户A购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,不能放入用户B 或用户C的购物车内的呢?这里我们就用cookie和session两种会话跟踪技术来跟踪整个会话。
3.cookie简介3.1.cookie的工作原理1)首先浏览器向服务器发出请求。
2)服务器就会根据需要生成一个Cookie对象,并且把数据保存在该对象内。
3)然后把该Cookie对象放在响应头,一并发送回浏览器。
4)浏览器接收服务器响应后,提出该Cookie保存在浏览器端。
5)当下一次浏览器再次访问那个服务器,就会把这个Cookie放在请求头内一并发给服务器。
服务器从请求头提取出该Cookie,判别里面的数据,然后作出相应的动作。
3.2.cookie中的常用方法Cookie cookie=new Cookie(String name,String value) 构造一个cookie对象response.addCookie(Cookie cookie) 是将一个cookie对象传入客户端。
javaweb中实现在线人数统计
javaweb中实现在线⼈数统计session并不是浏览器关闭时销毁的,⽽是在session失效的时候销毁下列代码就是监测session创建、销毁package com.my.count;import javax.servlet.http.*;public class SessionCounter implements HttpSessionListener {private static int activeSessions = 0;//session创建时执⾏public void sessionCreated(HttpSessionEvent se) {activeSessions++;}//session销毁时执⾏public void sessionDestroyed(HttpSessionEvent se) {if (activeSessions > 0)activeSessions--;}//获取活动的session个数(在线⼈数)public static int getActiveSessions() {return activeSessions;}}接下来就是配置web.xml<listener><listener-class>com.my.count.SessionCounter //这⾥是包名加类名</listener-class></listener>接下来就可以在jsp页⾯中使⽤<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@ page import="com.my.count.SessionCounter"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>My JSP 'ApplicationTest.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body>在线⼈数为:<%=SessionCounter.getActiveSessions() %></body></html>。
springboot用监听器统计在线人数案例分析
springboot⽤监听器统计在线⼈数案例分析本⽂在springboot 的项⽬,⽤HttpSessionListener 监听器(监听器的其中⼀种)统计在线⼈数,实质是统计session 的数量。
思路很简单,但是有个细节没处理好,让我调试了⼤半天,才把bug搞好。
先写个HttpSessionListener 监听器。
count 是session的数量(⼈数),session 创建的时候,会触发监听器的sessionCreated ⽅法,session销毁的时候,会触发监听器的sessionDestroyed ⽅法。
在监听器中计算完⼈数count,把他放进servletContext(可以理解为⼀个仓库,任意请求可以存储和获取⾥⾯的属性)。
注意监听器加上@WebListener,这样就不⽤配置。
@WebListenerpublic class OnLineCount implements HttpSessionListener {public int count=0;//记录session的数量//监听session的创建,synchronized 防并发bugpublic synchronized void sessionCreated(HttpSessionEvent arg0) {System.out.println("【HttpSessionListener监听器】count++ 增加");count++;arg0.getSession().getServletContext().setAttribute("count", count);}@Overridepublic synchronized void sessionDestroyed(HttpSessionEvent arg0) {//监听session的撤销System.out.println("【HttpSessionListener监听器】count-- 减少");count--;arg0.getSession().getServletContext().setAttribute("count", count);}}接着写⼀个查询session 数量的controller,我开始的时候是像下⾯这样写的,是错误的!从servletContext 中取出count ,把count返回前端。
JavaWeb会话技术Session的简单使用
JavaWeb会话技术Session的简单使⽤⽬录什么是SessionSession如何⼯作结合代码理解Session什么是SessionSession技术是将信息保存在服务端,⽽客户端需要接收、记录和回送Session的ID,所以Session通常情况下是借助Cookie 技术来传递ID给服务端的,服务端拿到session id之后查询内存中对应的记录。
⼀个客户端对应⼀个Session,⽽⼀个Session有多个Attribute,每⼀个Attribute有唯⼀的name。
编写代码证明提出的观点:protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession();PrintWriter writer = resp.getWriter();// 给session绑定⼀个user对象session.setAttribute("user", new User(1, "kongsam"));List<String> users = new ArrayList<>();users.add("kongsam");users.add("xiaoming");users.add("xiaohong");// 给session绑定⼀个list数组session.setAttribute("list", users);// 最后打印输出writer.println("JSESSIONID = " + session.getId());writer.println("object => user = " + session.getAttribute("user").toString());for (String user : users) {writer.println("list => user = " + user);}}两个不同的浏览器就是两个不同的客户端,这两个客户端对应不同的JSESSIONID。
利用Listener实现网站累积访问人数、最大同时在线人数、当前登录用户数的记录
利⽤Listener实现⽹站累积访问⼈数、最⼤同时在线⼈数、当前登录⽤户数的记录1.⽹站全局统计变量类,只定义全局变量1package com.lt.listener;23import java.util.Date;4import java.util.HashMap;5import java.util.Map;67import javax.servlet.http.HttpSession;8/**9 * ⽹站全局变量类10 * @author LIUTIE11 *12*/13public abstract class ApplicationConstants {1415/**16 * ⽤户登录session名称17*/18public static final String LOGIN_SESSION_NAME = "userInfo";1920/**21 * 索引所有的session22 * ⽤于单⼀登录23*/24public static Map<String,HttpSession> SESSION_MAP = new HashMap<>();2526/**27 * 当前在线⽤户数28*/29public static int CURRENT_LOGIN_COUNT = 0;3031/**32 * 历史访客总数33*/34public static int TOTAL_HISTORY_COUNT = 0;3536/**37 * 最⾼同时在线⼈数38*/39public static int MAX_ONLINE_COUNT = 0;4041/**42 * 服务器启动时间43*/44public static Date SERVER_START_DATE = new Date();4546/**47 * 最⾼在线⼈数时间48*/49public static Date MAX_ONLINE_COUNT_DATE = new Date();50515253 }View Code2.实现servletContext监听,⽤于记录服务器信息1 package com.lt.listener;23 import java.util.Date;45 import javax.servlet.ServletContextEvent;6 import javax.servlet.ServletContextListener;78 /**9 * servletContext监听10 * 记录服务器信息启动关闭时间等11 * @author LIUTIE12 *13 */14 public class MyContextListener implements ServletContextListener {1516 /**17 * 服务器启动时被调⽤18 */19 @Override20 public void contextDestroyed(ServletContextEvent arg0) {21 //记录启动时间22 ApplicationConstants.SERVER_START_DATE = new Date();23 }2425 /**26 * 服务器关闭时被调⽤27 */28 @Override29 public void contextInitialized(ServletContextEvent arg0) {30 //保存数据到硬盘31 // TODO Auto-generated method stub32 }3334 }View Code3.实现 HttpSessionListener, HttpSessionAttributeListener监听,⽤于记录登录信息、访问总⼈数、在线⼈数,实现单⼀登录等 1package com.lt.listener;23import java.util.Date;45import javax.servlet.http.HttpSession;6import javax.servlet.http.HttpSessionAttributeListener;7import javax.servlet.http.HttpSessionBindingEvent;8import javax.servlet.http.HttpSessionEvent;9import javax.servlet.http.HttpSessionListener;1011/**12 * session监听13 * 记录登录信息访问总⼈数在线⼈数等14 * 实现单⼀登录15 * @author LIUTIE16 *17*/18public class MySessionListener implements HttpSessionListener, HttpSessionAttributeListener {1920/**21 * session创建时被调⽤22*/23 @Override24public void sessionCreated(HttpSessionEvent sessionEvent) {25// 获取创建的session26 HttpSession session = sessionEvent.getSession();27// 添加到map28 ApplicationConstants.SESSION_MAP.put(session.getId(), session);29// 访问总⼈数++30 ApplicationConstants.TOTAL_HISTORY_COUNT++;31// 如果map总数⼤于最⾼同时在线⼈数则更新最⾼在线⼈数及时间32if (ApplicationConstants.MAX_ONLINE_COUNT < ApplicationConstants.SESSION_MAP.size()) {33 ApplicationConstants.MAX_ONLINE_COUNT = ApplicationConstants.SESSION_MAP.size();34 ApplicationConstants.MAX_ONLINE_COUNT_DATE = new Date();35 }3637 }3839/**40 * session销毁时被调⽤41*/42 @Override43public void sessionDestroyed(HttpSessionEvent sessionEvent) {44// 获取即将被销毁的session45 HttpSession session = sessionEvent.getSession();46// 在map中根据key移除47 ApplicationConstants.SESSION_MAP.remove(session.getId());48 }4950/**51 * 添加session属性时被调⽤52*/53 @Override54public void attributeAdded(HttpSessionBindingEvent event) {55// 判断是否添加的⽤户登录信息session56if (event.getName().equals(ApplicationConstants.LOGIN_SESSION_NAME)) {57// 当前登录⽤户数++58 ApplicationConstants.CURRENT_LOGIN_COUNT++;59// 是否在其他机器登录处理60 isLoginInOtherPlace(event);61 }62 }6364/**65 * 移除session属性时被调⽤66*/67 @Override68public void attributeRemoved(HttpSessionBindingEvent event) {69// 判断是否移除的⽤户登录信息session70if (event.getName().equals(ApplicationConstants.LOGIN_SESSION_NAME)) {71// 当前登录⽤户数--72 ApplicationConstants.CURRENT_LOGIN_COUNT--;73// 是否在其他机器登录处理74 isLoginInOtherPlace(event);75 }76 }7778/**79 * 修改session属性时被调⽤80*/81 @Override82public void attributeReplaced(HttpSessionBindingEvent event) {8384// 判断是否修改的⽤户登录信息session85if (event.getName().equals(ApplicationConstants.LOGIN_SESSION_NAME)) {86// 是否在其他机器登录处理87 isLoginInOtherPlace(event);88 }89 }9091/**92 * 是否在其他机器登录处理93 *94 * @param event95*/96private void isLoginInOtherPlace(HttpSessionBindingEvent event) {97// 获取添加的session98 HttpSession session = event.getSession();99// 遍历查找此⽤户是否登录100for (HttpSession s : ApplicationConstants.SESSION_MAP.values()) {101// 如果已经在其他机器登录则使其失效102if (event.getValue().equals(s.getAttribute(ApplicationConstants.LOGIN_SESSION_NAME)) 103 && session.getId() != s.getId()) {104// 使session失效105 session.invalidate();106break;107 }108 }109 }110 }View Code4.实现 request监听,⽤于记录客户信息 ip、url等1package com.lt.listener;23import javax.servlet.ServletRequestEvent;4import javax.servlet.ServletRequestListener;5import javax.servlet.http.HttpServletRequest;67/**8 * request监听⽤于记录客户信息 ip、url等9 *10 * @author LIUTIE11 *12*/13public class MyRequestListener implements ServletRequestListener {1415/**16 * request销毁时调⽤17*/18 @Override19public void requestDestroyed(ServletRequestEvent event) {20// TODO Auto-generated method stub2122 }2324/**25 * request创建时调⽤26*/27 @Override28public void requestInitialized(ServletRequestEvent event) {29 HttpServletRequest request = (HttpServletRequest) event;30// 客户端ip31 String ip = request.getRemoteAddr();32// 访问的URL地址33 String url = request.getRequestURI();34// 只做简单后台打印35 System.out.println("The client ip is " + ip);36 System.out.println("The address url is " + url);37 }3839 }View Code5.在web.xml中配置队⼀⾏的listener<listener><listener-class>com.lt.listener.MyContextListener</listener-class></listener><listener><listener-class>com.lt.listener.MySessionListener</listener-class></listener><listener><listener-class>com.lt.listener.MyRequestListener</listener-class></listener>View CodeListener种类: 1.监听对象的创建与销毁的Listener: HttpSessionListener: sessionCreated(HttpSessionEvent sessionEvent)、sessionDestroyed(HttpSessionEvent sessionEvent) ServletRequestListener: requestInitialized(ServletRequestEvent event)、requestDestroyed(ServletRequestEvent event) ServletContextListener: contextInitialized(ServletContextEvent event)、contextDestroyed(ServletContextEvent event) 2.监听对象的属性变化的Listener: HttpSessionAttributeListener:(添加、更新、移除session时触发) attributeAdded(HttpSessionBindingEvent event)、attributeReplaced(HttpSessionBindingEvent event)、attributeRemoved(HttpSessionBindingEvent event) ServletContextAttributeListener:(添加、更新、移除context时触发) attributeAdded(ServletContextAttributeEvent event)、attributeReplaced(ServletContextAttributeEvent event)、attributeRemoved(ServletContextAttributeEvent event) ServletRequestAttributeListener:(添加、更新、移除request时触发) attributeAdded(ServletRequestAttributeEvent event)、attributeReplaced(ServletRequestAttributeEvent event)、attributeRemoved(ServletRequestAttributeEvent event) 3.监听Session内的对象 HttpSessionBindingListener:(对象放⼊session、对象从session移除时触发) valueBound(HttpSessionBindingEvent event)、valueUnbound(HttpSessionBindingEvent event) HttpSessionActivationListener:(session中的对象被钝化、对象被重新加载时触发ps:将session中的内容保存到硬盘的过程叫做钝化,钝化需实现Serializable序列化接⼝) sessionWillPassivate(HttpSessionEvent event)、sessionDidActivate(HttpSessionEvent event)。
javaweb组件数据共享的四种范围
javaweb组件数据共享的四种范围JavaWeb开发中,数据共享是非常常见且重要的一个功能。
在一个Web应用程序中,往往会有多个组件需要共享同一份数据,而不同组件之间的数据共享需要满足一定的范围。
本文将介绍JavaWeb 中四种常见的数据共享范围。
一、应用程序(ServletContext)范围应用程序范围是最大的数据共享范围,它可以被应用程序中的所有组件访问。
在JavaWeb中,应用程序范围的数据是通过ServletContext对象来实现的。
ServletContext对象是在Web应用程序启动时创建的,它代表了整个应用程序的运行环境。
我们可以通过ServletContext对象的setAttribute()方法来设置应用程序范围的数据,通过getAttribute()方法来获取数据。
应用程序范围的数据在整个应用程序的生命周期内都是有效的,可以被所有组件共享。
比如,我们可以将一些全局配置信息、共享的数据库连接池等数据保存在应用程序范围中,以便于各个组件使用。
二、会话(Session)范围会话范围是指在用户与Web应用程序之间建立的会话期间有效的数据共享范围。
在JavaWeb中,会话范围的数据是通过HttpSession对象来实现的。
HttpSession对象代表了用户与Web 应用程序之间的会话,它在用户第一次访问Web应用程序时创建,直到会话结束或超时才销毁。
我们可以通过HttpSession对象的setAttribute()方法来设置会话范围的数据,通过getAttribute()方法来获取数据。
会话范围的数据只在当前会话中有效,不同用户之间的会话数据是相互独立的。
比如,我们可以将用户的登录信息、购物车数据等保存在会话范围中,以便于在整个会话期间都可以访问和使用。
三、请求(Request)范围请求范围是指在一次HTTP请求中有效的数据共享范围。
在JavaWeb中,请求范围的数据是通过HttpServletRequest对象来实现的。
关于JSP中基于Session的在线用户统计分析在线用户列表
JSP作为后起之秀能够在服务器编程环境中占据一定地位,是和它良好支持一系列业界标准密切相关的。
Seion就是它提供的基础设施之一。
作为一个程序员,你可以不介意具体在客户端是如何实现,就方便的实现简单的基于eion的用户管理。
现在对于处理在线用户,有几种不同的处理方法。
一种是页面刷新由用户控制,服务器端控制一个超时时间比如30分钟,到了时间之后用户没有动作就被踢出。
这种方法的优点是,如果用户忘了退出,可以防止别人恶意操作。
缺点是,如果你在做一件很耗时间的事情,超过了这个时间限制,ubmit的时候可能要再次面临登陆。
如果原来的叶面又是强制失效的话,就有可能丢失你做的工作。
在实现的角度来看,这是最简单的,Server端默认实现的就是这样的模式。
另一种方式是,站点采用框架结构,有一个Frame或者隐藏的iframe在不断刷新,这样你永远不会被踢出,但是服务器端为了判断你是否在线,需要定一个发呆时间,如果超过这个发呆时间你除了这个自动刷新的页面外没有刷新其他页面的话,就认为你已经不在线了。
采取这种方式的典型是。
他的优点是可以可以利用不断的刷新实现一些类似erver-puh的功能,比如网友之间发送消息。
不管哪一种模式,为了实现浏览当前所有的在线用户,还需要做一些额外的工作。
Servlet API中没有得到Seion列表的API。
可以利用的是Litener. Servlet 2.2和2.3规范在这里略微有一些不一样。
2.2中HttpSeionBindingLitener可以实现当一个HTTPSeion中的Attribute变化的时候通知你的类。
而2.3中还引入了HttpSeionAttributeLitener.鉴于我使用的环境是Viual age for Java 4和JRun erver 3.1,他们还不直接支持Servlet 2.3的编程,这里我用的是HttpSeionBindingLitener.需要做的事情包括做一个新的类来实现HttpSeionBindingLitener接口。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JavaWeb中的Session、SessionListener、在线人数统计
2010-04-06 11:45
JavaWeb中的Session
∙在JavaWeb中使用HttpSession(以下简称session)对象来表示一个会话。
∙Session的创建(代表会话周期的开始):第一次调用request.getSession()方法时,会创建一个session对象。
∙Session的销毁(代表会话周期的结束):在某个请求周期内调用了Session.invalidate()方法,此请求周期结束后,session被销毁;或者是session超时后自动销毁。
∙对于JSP,如果指定了<%@ page session="false"%>,则在JSP中无法直接访问内置的session变量,同时也不会主动创建session,因为此时JSP未自动执行request.getSession()操作获取session。
∙在session对象刚创建的第一个请求周期内,调用session.isNew()方法将得到true。
∙可以在web.xml文件中配置session默认的超时时间(分钟):
<session-config>
<session-timeout>10</session-timeout>
</session-config>
也可以调用session. setMaxInactiveInterval()方法设置session超时时间(分钟)
SessionListener
∙通过SessionListenr可以监听session的创建和销毁,步骤:
1.写一个类MySessionListener,实现 javax.servlet.http.HttpSessionListener接口及其sessionCreated()、 sessionDestroyed()方法
2.在web.xml中配置SessionListener:
<listener>
<listener-class>MySessionListener类全名</listener-class>
</listener>
当session 被创建和销毁时,容器会分别调用SessionListener的sessionCreated()方法和sessionDestroyed()方法,这两个方法中传入了一个参数对象HttpSessionEvent,可以通过此对象的getSession()方法获取session对象。
应用:在线人数统计
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范围由一个HashSet集保存所有的session
HashSet sessions = (HashSet) application.getAttribute("sessions");
if (sessions == null) {
sessions = new HashSet();
application.setAttribute("sessions", sessions);
}
// 新创建的session均添加到HashSet集中
sessions.add(session);
// 可以在别处从application范围中取出sessions集合
// 然后使用sessions.size()获取当前活动的session数,即为“在线人数” }
public void sessionDestroyed(HttpSessionEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
HashSet sessions = (HashSet) application.getAttribute("sessions");
// 销毁的session均从HashSet集中移除
sessions.remove(session);
}
}。