jsp防止重复登录问题以及关闭浏览器,意外断电等情况使用户退出的解决方法

一、防止用户重复登录

这是登录请求界面submitLogin.jsp,只有java代码:

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="com.jdbc.entity.UserInfoEntity"%>
<%@page import="com.jdbc.manager.SchoolManager"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<% 
request.setCharacterEncoding("UTF-8");
UserInfoEntity user=new UserInfoEntity();
String logname=request.getParameter("logname");
String userpwd=request.getParameter("userpwd");
user.setLogname(logname);
user.setKeyword(userpwd);
//获取在线用户的集合
List<UserInfoEntity> onlineList=(List<UserInfoEntity>)application.getAttribute("ol");
if(onlineList==null){
onlineList=new ArrayList<UserInfoEntity>();
application.setAttribute("ol",onlineList);
}
//判断用户是否已登录 已登录的话返回登录界面。  
for(int i=0;i<onlineList.size();i++){
if(onlineList.get(i).getLogname().equals(user.getLogname())){
response.sendRedirect("Login.jsp?add=-1");
return;
}
}
//调用登录验证方法,判断用户是否再存 
user=SchoolManager.checkLogin(user);
//用户存在 将该用户添加到在线列表onlineList中,给该用户一个session并且进入主界面  
if(user!=null){
onlineList.add(user);
session.setAttribute("user",user);
response.sendRedirect("../Index/index.jsp");
}else{
response.sendRedirect("Login.jsp?add=0");
}

%>


 

二、用户退出请求界面submitLogin.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@page import="com.jdbc.entity.UserInfoEntity"%>
<%
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 'submitExits.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>
  <%
   UserInfoEntity user=(UserInfoEntity)session.getAttribute("user");
   List<UserInfoEntity> onlineList=(List<UserInfoEntity>)application.getAttribute("ol");
   for(int i=0;i<onlineList.size();i++){
      if(onlineList.get(i).getLogname().equals(user.getLogname())){
   	
   	onlineList.remove(i);
   	session.invalidate();
   }
   }
   
   %>
  <body>
   
  </body>
  <script type="text/javascript">
  window.close();
  </script>
</html>


问题来了,若用户关闭浏览器或意外断电等情况发生时时,那么在用户useronlineList中还存在,他再次登录的时候会提示已在线该如何解决?

 

 

三、关闭浏览器时用户的退出 

老师说出现这种情况的话要重建写一界面,利用框架解决,具体我还没有搞清楚,等弄明白了在把这块更新上。

 

 

四、意外断电等情况时的用户退出:

这个就要利用HttpSessionListener来解决了,首先建一个共具类SystemWebListener实现接口HttpSessionListener。

然后在web.xml中进行如下配置:
  <listener>
   <listener-class>com.jdbc.tool.SystemWebListener</listener-class>//这个必须是你这个工具类的路径 不要写错
  </listener>

工具类代码如下:

 

package com.jdbc.tool;


import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import com.jdbc.entity.UserInfoEntity;

public class SystemWebListener implements HttpSessionListener{

	public void sessionCreated(HttpSessionEvent se) {
		
	}

	public void sessionDestroyed(HttpSessionEvent se) {
		try {
			HttpSession session=se.getSession();
			ServletContext app=session.getServletContext();
			List<UserInfoEntity> useronlineList=(List<UserInfoEntity>) app.getAttribute("ol");
			UserInfoEntity user=(UserInfoEntity) session.getAttribute("user");
			for (int i = 0; i < useronlineList.size(); i++) {
				if(useronlineList.get(i).getLogname().equals(user.getLogname())){
					useronlineList.remove(i);
					return;
				}
				
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

}


 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值