防止web应用同一个账户重复登录一般有一下两种方式:
session实现
1.一个账号登进去了,再用这个账号就登不进去:
打开一个浏览器客户端就有个sessionId与服务器对用,关闭后客户端的没了,但是服务端的还有这个session,
缺点:所以非法关闭的话,没有调用session.invalidate()方法的话,这个session依然存在。只有等到session过期,一般30分钟。这样用户要等这么长时间,肯定不好,所以尽可能的要捕捉非法关闭的事件,网上搜了,有些事件不好捕获,如先最小化在关闭等。
2.一个账号登进去了,再用这个账号登进去,前一个session失效,提示账户已经在别处登录。
缺点:如果也是非法关闭。用户有没有重新登录,session没有释放,在线统计不太对,有点就是不影响用户使用,可以继续登进去使用。
所以选择第二种:
struts2
1.action里的某个方法,
public void totalCount()
{ HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
//就是获取用户名,因为是struts2可以这样获取
String username = user.getFirstname();
// 把用户名放入在线列表
Map<String,String> onlineUserList = (Map<String,String>) ServletActionContext.getServletContext().getAttribute("onlineUserList");
// 第一次使用前,需要初始化
if (onlineUserList == null) {
onlineUserList = new HashMap<String,String>();
}
//用户名一样,sessionid不一样,所以是二次登录 if(onlineUserList.containsKey(username) && !(onlineUserList.get(username).equals(session.getId())) )
{
onlineUserList.remove(username);
}
session.setAttribute("username", username);
onlineUserList.put(username,session.getId());
ServletActionContext.getServletContext().setAttribute("onlineUserList", onlineUserList);
}
2.Listener,销毁session,只要调用session.invalidate()就会执行
public class UserListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
}
@SuppressWarnings("unchecked")
public void sessionDestroyed(HttpSessionEvent event) {
HttpSession session = event.getSession();
// 取得登录的用户名
String username = (String) session.getAttribute("username");
ServletContext application = session.getServletContext();
System.out.println("Listener开始");
System.out.println("sessionId:"+session.getId());
System.out.println("username:"+username);
// 获取在线列表
Map<String,String> onlineUserList = (Map<String,String>) application.getAttribute("onlineUserList");
//session超时删除用户,重复登录登录时已删除,不再删了
if(onlineUserList.containsKey(username) && (onlineUserList.get(username).equals(session.getId())) )
{
onlineUserList.remove(username);
ServletActionContext.getServletContext().setAttribute("onlineUserList", onlineUserList);
}
System.out.println("onlineUserList:"+onlineUserList);
System.out.println("Listener结束");
}
}
3.filter
public class UserFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void destroy() {
}
@SuppressWarnings("unchecked")
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession();
System.out.println("过滤Filter开始");
// 从ServletContext中取出List
Map<String, String> sessionlist = (Map<String, String>) session
.getServletContext().getAttribute("onlineUserList");
System.out.println("sessionlist:" + sessionlist);
if (sessionlist == null) {
sessionlist = new HashMap<String, String>();
}
String username = (String) session.getAttribute("username");
System.out.println("username:" + username);
System.out.println("sessionid:" + session.getId());
//因为过滤所有页面web.xml配置的是/*,第一次登陆username为空,得让可以登录
if (null == username) {
chain.doFilter(req, res);
System.out.println("过滤Filter结束username=null");
} else {
// 用于记录状态
boolean temp = false;
System.out.println(sessionlist.containsKey(username));
System.out.println(sessionlist.get(username));
System.out.println(sessionlist.get(username)
.equals(session.getId()));
if (sessionlist.containsKey(username)
&& sessionlist.get(username).equals(session.getId())) {
// session值与当前ID匹配,说明同一个用户
temp = true;
System.out.println("过滤Filter结束,同一个用户");
}
// 存在了第二次登陆,销毁session
System.out.println("temp:" + temp);
if (!temp) {
session.invalidate();
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
//转向的首页,根据自己项目
response
.getWriter()
.print(
"<script>window.top.location.href='/ssh2/save.jsp';alert('该账号已经在别处登录,请联系管理员或关闭ie,重新登录!');</script>");
} else {
chain.doFilter(req, res);
}
}
}
}
web.xml的配置。
filter放在struts2拦截器的前面
<filter>
<filter-name>userFilter</filter-name>
<filter-class>
com.test.action.user.UserFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>userFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
listener的配置
调用session.invalide()的方法会被监听到,销毁session
<listener>
<listener-class>com.test.action.user.UserListener</listener-class>
</listener>
大概实现了,可能考虑不周:如果有问题共同探讨。
分享到:
相关推荐
统计在线人数,是否登录过,小例子,用jsp/HttpSessionBindingListener实现 ,有需要的请猛击下载,无源码。要源码,地址:http://download.csdn.net/source/1845699
1、在负载均衡以及单服务器部署模式下面解决同一个账户不能重复登录问题,如果重复登录则之前会话失效. 2、只提供负载均衡情况下避免账户重新登录解决方案。在线人数统计也可以参考这种方法实现,未做具体描述。
项目需求,试着写了一个简单登录统计,基本功能都实现了,日志数据量小。具体性能没有进行测试~ 记录下开发过程与代码,留着以后改进! 1. 需求 实现记录用户哪天进行了登录,每天只记录是否登录过,重复登录...
实现某部门职工信息管理。职工信息包括:职工号、姓名、性别、年龄...6、统计功能:对文件中某关键字的相关记录内容信息进行统计(比如人数.工资等),7、排序:根据给定字段,对记录进行排序,例如:按工资的高低排序
数据现在是这样的,我想确定出type列中的... 您可能感兴趣的文章:MySQL 统计查询实现代码MYSQL中有关SUM字段按条件统计使用IF函数(case)问题利用MySQL统计一列中不同值的数量方法示例单个select语句实现MySQL查询统计次
能统计学生人数、课程门数、选修某门课程学生的相关信息。 (4)保存功能:可将当前系统中各类记录存入文件中,存入方式任意。 (5)退出功能 扩展功能 (1)编辑功能:可根据查询结果对相应的记录进行修改,修改时...
能统计学生人数、按性别统计、按年龄统计等。 *(7)保存功能:可将当前系统中各类记录存入文件中,存入方式任意。 *(8)读取功能:可将保存在文件中的信息读入到当前系统中,供用户进行使用。
DENSE_RANK完成--Score重复时保留名次空缺(rank完成)--Score重复时合并名次(DENSE_RANK完成)--23、统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比 --23.1 统计各科成绩...
****** Object: Database Student Script Date: 2004-2-6 20:23:55 ******/ IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'Student') DROP DATABASE [Student] GO
重复的工作超级讨人厌有木有? 每天让你登陆10个微信公众账号,只是为了看一眼关注人数很让人恼火有木有? 自从有了这个浏览器插件,脖子也不酸了,背也不疼了。咱总算可以安心码自己喜欢的代码了! Bravo! 使用...
3A幼教幼儿园收费系统,是专为幼儿园设计的财务收费...5、收费统计:阶段收费汇总统计、项目人数统计、班级缴费人数统计、班级明细等 6、票据打印:兼容A4、二等分、三等分纸各种票据打印 3A幼教幼儿园收费系统截图
因为班上要从12个选出8个人,而且8个人要分三...一些功能:只能输入80-99的分数之间,统计投票人数,统计投票结果,不能重复刷分。使用很简单,按照或修改install.php文件,建立相应的数据表.加我qq953694678一起交流。
cout[k]成绩分类人数: 优"[0]人 良"[1] 人 中"[2]人 及"[3]人 不及"[4]人"; cout(ios::fixed)(1) [k]成绩分类比例: 优"(float)b[0]*tem良" (float)b[1]*tem中"(float)b[2]*tem及" (float)b[3]*tem不及"...
(6)统计功能:能根据多种参数进行统计,能统计学生人数、按性别统计、按年龄统计等。 (7)保存功能:可将当前系统中各类记录存入文件中,存入方式任意。 (8)读取功能:可将保存在文件中的信息读入到当前系统中, 供...
7:新增页面统计功能,可在线统计当天的浏览人次/IP/浏览量,平均浏览时间,后台可设置关闭。 8:新增权限控制,能精细控制后台管理用户的浏览/访问模块。 9:新增全局日志函数,后台可设置删除日志及查看日志...
• 学员英语成绩分段统计人数 • 计算比赛评分表中频率最高的分值 • 利用极值函数限定销售价格 • 取得不重复的第2 个最低报价 • 统计各科成绩大于等于平均分的总平均分 • 计算体操比赛的选手得分 • 统计年度...
问卷调查对象分为需要指定用户登录和所有用户(即不需要登录)两种方式,对于所有用户分为:可以填写姓名和科室或不填写姓名和科室,填起后台统计就显示姓名和科室,不填就默认显示为游客; 3. 每个问卷一个大标题...
统计人数 求各分数段人数 有什么方法统计偶数 如何显示 工资统计中的问题 统计数据问题一例 根据给定的条件,对数据进行合计 十列数据合计成一列 统计汉字字符个数 关于取数 统计单元格内不为空的格数 自动将销量前...
统计人数 求各分数段人数 有什么方法统计偶数 如何显示 工资统计中的问题 统计数据问题一例 根据给定的条件,对数据进行合计 十列数据合计成一列 统计汉字字符个数 关于取数 统计单元格内不为空的格数 自动将销量前...
本工具箱包括成绩统计、多排表、表格比较与填充、检测重复值、考场编排、上线人数统计、批量插入分页符、批量导入图片、多表合并、多个表格文件合并、批量读取文件名、文件批量改名、课程表编排、身份证校验等在教务...