JSP防止重复登录
请看如下例子
1:新建web工程
2:新建com.user包
依次新建如下JAVA文件
LoginAction.java
package com.user;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Date;
import java.util.Set;
import java.util.Map.Entry;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("unchecked")
public class LoginAction extends HttpServlet
{
private static final long serialVersionUID = 1L;
public static Map<String,OnLineUser> onLineUserMap = newHashMap<String,OnLineUser>();
public void init() throws ServletException
{
String path = this.getServletContext().getContextPath();
this.getServletContext().setAttribute("path",path);
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException
{
String action = req.getParameter("method");
if("login".equals(action))
{
String hydh = req.getParameter("hydh");
String hymc = req.getParameter("hymc");
if(checkLoginUser(hydh))
{
req.setAttribute("msg","该行员已经登录,请联系管理员");
req.getRequestDispatcher("/login.jsp").forward(req,resp);
return;
}
OnLineUser oLineUser = new OnLineUser();
oLineUser.setHydh(hydh);
oLineUser.setDlsj(new Date().toLocaleString());
LoginUser loginUser = new LoginUser();
loginUser.setHydh(hydh);
loginUser.setHymc(hymc);
SessionContainer sessionContainer = new SessionContainer();
sessionContainer.setLoginUser(loginUser);
oLineUser.setSessionContainer(sessionContainer);
req.getSession().setAttribute("USER",sessionContainer);
onLineUserMap.put(hydh,oLineUser);
resp.sendRedirect(req.getContextPath()+"/user.do?method=list");
return;
}
else if("logout".equals(action))
{
OnLineUser ol =LoginAction.onLineUserMap.get(req.getParameter("hydh"));
if(ol!=null)
{
ol.getSessionContainer().shutdown();
}
if("1".equals(req.getParameter("type")))
{
resp.sendRedirect(req.getContextPath()+"/user.do?method=list");
}
else
{
if(req.getSession() != null)
{
req.getSession().invalidate();
}
resp.sendRedirect(req.getContextPath()+"/login.jsp");
}
return;
}
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException
{
this.doGet(req, resp);
}
private boolean checkLoginUser(String hydh)
{
OnLineUser ol = (OnLineUser)onLineUserMap.get(hydh);
if(ol==null)
{
return false;
}
else
{
LoginUser lu = ol.getSessionContainer().getLoginUser();
if(lu==null)
{
return false;
}
else
{
return true;
}
}
}
public static List getUserList()
{
List list = new ArrayList();
Set<Entry<String,OnLineUser>> sets = onLineUserMap.entrySet();
Iterator iter = sets.iterator();
while( iter.hasNext())
{
Entry en = (Entry)iter.next();
list.add(en.getValue());
}
return list;
}
}
LoginFilter.java
package com.user;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
public class LoginFilter implements Filter
{
public void destroy()
{
}
public void doFilter(ServletRequest req, ServletResponse resp,FilterChain fc)throws IOException, ServletException
{
HttpServletRequest request = (HttpServletRequest)req;
String url = request.getRequestURI();
String index = request.getContextPath()+"/";
if(url.equals(index) || url.indexOf("login.jsp") != -1 || url.indexOf("index.jsp") != -1 || url.indexOf("login.do") != -1)
{
fc.doFilter(req,resp);
return;
}
HttpSession session = request.getSession();
Object user = session.getAttribute("USER");
if( user == null)
{
request.setAttribute("msg","请先登录");
request.getRequestDispatcher("/login.jsp").forward(req,resp);
return;
}
else
{
SessionContainer sc = (SessionContainer)user;
if(sc.getLoginUser() == null)
{
request.setAttribute("msg","请先登录");
request.getRequestDispatcher("/login.jsp").forward(req,resp);
return;
}
}
fc.doFilter(req,resp);
return;
}
public void init(FilterConfig arg0) throws ServletException
{
}
}
LoginUser.java
package com.user;
public class LoginUser
{
private String hydh;
private String hymc;
public String getHydh() {
return hydh;
}
public void setHydh(String hydh) {
this.hydh = hydh;
}
public String getHymc() {
return hymc;
}
public void setHymc(String hymc) {
this.hymc = hymc;
}
}
OnLineUser.java
package com.user;
public class OnLineUser
{
private String hydh;
private String dlsj;
private SessionContainer sessionContainer;
public String getHydh()
{
return hydh;
}
public void setHydh(String hydh) {
this.hydh = hydh;
}
public String getDlsj() {
return dlsj;
}
public void setDlsj(String dlsj) {
this.dlsj = dlsj;
}
public SessionContainer getSessionContainer() {
return sessionContainer;
}
public void setSessionContainer(SessionContainer sessionContainer) {
this.sessionContainer = sessionContainer;
}
}
SessionContainer.java
package com.user;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class SessionContainer implements HttpSessionBindingListener
{
private LoginUser loginUser = null;
public void valueUnbound(HttpSessionBindingEvent event)
{
shutdown();
}
public void valueBound(HttpSessionBindingEvent event)
{
}
public LoginUser getLoginUser() {
return loginUser;
}
public void setLoginUser(LoginUser loginUser) {
this.loginUser = loginUser;
}
public void shutdown()
{
if(this.loginUser != null)
{
LoginAction.onLineUserMap.remove(this.loginUser.getHydh());
this.setLoginUser(null);
}
}
}
UserAction.java
package com.user;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("unchecked")
public class UserAction extends HttpServlet
{
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException
{
String action = req.getParameter("method");
if("list".equals(action))
{
List list = LoginAction.getUserList();
req.setAttribute("list", list);
req.getRequestDispatcher("/list.jsp").forward(req,resp);
return;
}
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException
{
this.doGet(req, resp);
}
}
3:在WebRoot目录下依次新建如下JSP文件
Index.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Language" content="zh-CN" />
<title>登录</title>
</head>
<body>
<a href="${ path}/login.jsp">登录</a>
</body>
</html>
List.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Language" content="zh-CN" />
<title>用户列表</title>
<script type="text/javascript">
function logout(hydh)
{
if(confirm("你确定要踢出该用户吗"))
{
window.location.href="${ path}/login.do?method=logout&type=1&hydh="+hydh;
}
}
function shutdown()
{
if(confirm("你确定要退出吗"))
{
window.location.href="${ path}/login.do?method=logout&hydh=${sessionScope.USER.loginUser.hydh}";
}
}
function refsh()
{
window.location.href="${ path}/user.do?method=list";
}
</script>
</head>
<body>
<center>
<h3>你好,欢迎回来 ${sessionScope.USER.loginUser.hydh}</h3>
</center>
<table align="center" width="80%" border="1">
<tr>
<td>登录代号</td>
<td>登录时间</td>
<td>操作</td>
</tr>
<c:forEach var="u" items="${requestScope.list}">
<tr>
<td>${ u.hydh}</td>
<td>${ u.dlsj}</td>
<td><a href="javascript:logout('${ u.hydh}')">踢出</a></td>
</tr>
</c:forEach>
</table>
<br />
<a href="javascript:refsh()">刷新列表</a>
<a href="javascript:shutdown()">重新登录</a>
<a href="${ path}/user.do?method=download">下载用户</a>
</body>
</html>
Login.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Language" content="zh-CN" />
<title>登录</title>
</head>
<body>
<center>
<h2 style="color:red;">${ requestScope.msg}</h2>
</center>
<center>
<form action="${ path}/login.do?method=login" method="post">
hydh:<input type="text" name="hydh" /><br />
hymc:<input type="text" name="hymc" /><br />
<input type="submit" value="登录"/>
</form>
</center>
</body>
</html>
4:修改web.xml文件,添加如下内容
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<listener>
<listener-class>com.user.SessionContainer</listener-class>
</listener>
<filter>
<filter-name>login_filter</filter-name>
<filter-class>com.user.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>login_filter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>login_filter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>login_servlet</servlet-name>
<servlet-class>com.user.LoginAction</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>login_servlet</servlet-name>
<url-pattern>/login.do</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>user_servlet</servlet-name>
<servlet-class>com.user.UserAction</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>user_servlet</servlet-name>
<url-pattern>/user.do</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>5</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>