- 浏览: 606202 次
- 性别:
- 来自: 郑州
文章分类
最新评论
-
AlanKay:
Mart_dai 写道Hi 齐晓威_518,我想问问,在exc ...
java 后台 Excel 文件生成后转化为字节流 -
18335864773:
国内的pageoffice插件也可以生成excel。也可以用流 ...
java 后台 Excel 文件生成后转化为字节流 -
JAVA_CLASSm:
你好,请问这个还有源码吗?我刚开始接触这个,想要源码学习一下. ...
同一账号不能多地登录(限制同一账号同一时刻只能一个用户登录使用,向QQ一样) -
pangjinquan:
...
前台JS获取后台的Json数据, 动态创建table并填充数据--转自一位朋友 -
lvjun106:
这是增加删除列,,,,
JQuery自动为表格增加一列
解决四个问题:
1. 实现在线用户列表
2. 当用户在异地登录后,使前一次登录自动退出
3. 关闭浏览器,session失效,该session对应当前登录用户将会从在线列表移除,
4. 用户正常退出,session失效,该session对应当前登录用户将会从在线列表移除,
实现方法:
用户登录时,会创建一个session,用于保存用户信息。将所有用户登录时的session值与ID存入ServletContext中,显示在线列表的时候,就从ServletContext中取得用户登录的session值,从中取得用户信息。
(限制同一账号同一时刻只能一个用户登录使用向QQ一样,不能多地登录
情况一:没有登录,则将用户登录信息放置于用户在线容器列表
情况二:已登录,则判断是否异地重复登录,重复登录则踢出上一登录,将其session失效,
将最新的登录会话放置于用户在线列表中。)
1. 登录:
先从ServletContext中取出存放用户登录的session 相关信息,检查这个列表,如果已经存在相同的登录信息,则说明用户之前已经登录过,移除前面一条记录。
再把此次登录的信息加入到ServletContext中。
2.监听:
实现SessionListener类,当session失效的时候,从ServletContext中移除相应记录。
3.过滤:
过滤所有页面,sesison失效后转向登录页面。但是要实现用户二次登录后强制先前的登录失效,需要在这里控制。
登录时存入的是session值和session ID,用户二次登录时移除了前线记录,存入的session值是相同的,但是ID却不同。
当第一次登录的页面请求的时候,在这里检查ServletContext中是否存在当前的session值与ID记录。如果没有就销毁这个session。
参考代码:
存放的时候有很多中方法,我选择的是将session值与ID先存入一个List,在将这个List存到ServletContext中。
即将用户登录信息放置于用户在线容器列表,已登录,则判断是否重复登录,重复登录则踢出上一登录,将其session失效,
将最新的登录放置于用户在线列表中。
============================1. 登录部分============================
一、Struts中的Action登录校验方法
String forwardAction = LOGIN_ACTION;
boolean checkFlag=false;//是否验证通过
String userId = WebUtils.getParameter(request,"userId", null);
String userPassword = WebUtils.getParameter(request,"userPassword", null);
if (StringUtils.isNotEmpty(userId) && StringUtils.isNotEmpty(userPassword)) {
AppUser appUser = this.userService.getAppUser(userId);
if (appUser != null) {
String pass = appUser.getPassWord();
if(appUser.getIsLock()==1){
request.setAttribute("userLockError", "抱歉,该用户已经被锁定!");
} else if (appUser.getUserFlag()==2) {
request.setAttribute("userLockError", "抱歉,该用户已经被注销!");
} else if (userPassword.equals(pass)) {
checkFlag=true;
/**
* 第二:判断用户用户是否重复登录
* 限制同一账号同一时刻只能一个用户登录使用向QQ一样,不能多地登录
* 情况一:没有登录,则将用户登录信息放置于用户在线容器列表
* 情况二:已登录,则判断是否重复登录,重复登录则踢出上一登录,将其session失效,
* 将最新的登录放置于用户在线列表中。
*/
if(SessionManager.getSingleUserLoginManage(request,appUser)){
return new ActionForward("/" +forwardAction);
}else{
forwardAction = MAIN_ACTION;
}
} else {
request.setAttribute("passError", "密码错误");
}
} else {
request.setAttribute("userError", "用户名错误");
}
}
if(checkFlag){
response.sendRedirect(forwardAction);
return null;
}else{
return new ActionForward("/" +forwardAction);
}
二、校验是否重复登录公共方法
/**
* 限制同一账号同一时刻只能一个用户登录使用向QQ一样,不能多地登录
* @Description:用户在线管理控制类
* 判断用户用户是否重复登录
* 情况一:没有登录,则将用户登录信息放置于用户在线容器列表
* 情况二:已登录,则判断是否重复登录,重复登录则踢出上一登录,将其session失效,
* 将最新的登录放置于用户在线列表中。
* @param appUser
* @ReturnType boolean
* @author: QIXIAOWEI
* @Created xxxxxxxxxxxxx
*/
public static boolean getSingleUserLoginManage(HttpServletRequest request,AppUser appUser){
String operationFlag ="N";//用户是否被踢除,Y表示踢除成功,N踢除失败
boolean forwardFlag=false;//踢除重复登录用户,被踢除用户是否转向登录页面
int interval = PropertiesBean.getProperty(PARAM_SESSION_TIMEOUT, DEFUALT_SESSION_TIMEOUT);
HttpSession session = request.getSession(true);
//声明application系统公有数据
ServletContext application = (ServletContext)session.getServletContext();
//用户登录信息
session.setAttribute("loginCurrUser",appUser);
session.setAttribute("id", session.getId());
//设置session超时时间
session.setMaxInactiveInterval(interval);
//session生成时间的值
session.setAttribute("loginTime",session.getCreationTime());
/**
* 第二:判断用户用户是否重复登录
* 情况一:没有登录,则将用户登录信息放置于用户在线容器列表
* 情况二:已登录,则判断是否重复登录,重复登录则踢出上一登录,将其session失效,
* 将最新的登录放置于用户在线列表中。
*/
List onlineUserList = (List) application.getAttribute("onlineUserList");
if (onlineUserList ==null || onlineUserList.size()==0) {
/**判断用户在线容器列表是否存在,没有则创建一个并放入ServletContext **/
onlineUserList = new ArrayList();
application.setAttribute("onlineUserList", onlineUserList);
/**将登录用户会话信息,并设置到ServletContext中用户在线容器List中**/
onlineUserList.add(session);
}else {
/**检查用户是否重复登录,如果重复登录,则踢出上一次登录,保留本次登录-START**/
if(onlineUserList!=null && onlineUserList.size()>0){
/**遍历用户信息List容器-START**/
for(int i=0;i<onlineUserList.size();i++){
/**分别取出在线列表中的每一个登录会话信息**/
HttpSession obj = (HttpSession)onlineUserList.get(i);
/**
* 判断用户是否重复登录
* 如果存在就返回当前的会话。如果参数是false,
* 那么在request的当前会话不存在的时候就返回null
***/
boolean clearFlag=false;//如果重复登录,踢除上一次,处理用户刷新
/**取出application对象中放置的会话信息集合某个属性,与当前新登录会话信息属性进行比较-判断用户是否登录-START**/
if(request.getSession(false)!=null && obj!=null){
if(session.getAttribute("loginCurrUser")!=null && obj.getAttribute("loginCurrUser")!=null){
AppUser AppUserOne=(AppUser)obj.getAttribute("loginCurrUser");
AppUser AppUserTwo=(AppUser)session.getAttribute("loginCurrUser");
if((AppUserOne!=null && AppUserTwo!=null) && ((AppUserOne.getUserId()).equals(AppUserTwo.getUserId()))){
if(obj.getAttribute("loginTime")!=null && session.getAttribute("loginTime")!=null){
/**在线列表中该用户上次session生成时间**/
long obj_time = Long.parseLong(obj.getAttribute("loginTime").toString());
/**当前该用户新会话session生成时间的值**/
long session_time = Long.parseLong(session.getAttribute("loginTime").toString());
/**session生成时间转换成日期-START**/
Date firstDate=new Date(obj_time);//
Date secondDate=new Date(session_time);
//前面的MM一定要大写,表示月份,后面的mm小写,表示分钟
//SimpleDateFormat firstFormat=new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
//SimpleDateFormat secondFormat=new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
/**session生成时间转换成日期-END**/
/**
* 特殊情况控制,用户同一浏览器登录-,虽然登录时间不同
* 但为同一用户,不再向用户在线列表中增加值
**************************************************
* 如果非要控制同一账户同一系统,同一浏览也不允许登录,则需要重新
* 执行下面踢除操作,并重新执行第一步,重新生成会话
**************************************************
***/
clearFlag=true;
/**
* 在满足全局对象‘用户对象标识值’与新登录用户标识值相同的情况下
* 将application对象中的会话属性(session生成时间的值)与新的会话属性进行比较
* 如果旧的会话生成时间小于新的会话生成时间,则表示该用户已经登录
******************************************************
*如果成功页面用的是转发不是重定向,该句需要放开,涉及到刷新
* -START**/
//if(obj_time<session_time && DateUtils.isBefore(firstDate, secondDate)){
/**将新的会话放置于集合中**/
onlineUserList.add(session);
obj.invalidate();//销毁原来的session
operationFlag="Y";
break;
//}
}
}
}
}
/**没有重复的,即正常登录,将登录会话放于集合中,用于登录后页面刷新**/
if(!clearFlag){
onlineUserList.add(session);
break;
}
/**取出application对象中放置的会话信息集合某个属性,与当前新登录会话信息属性进行比较-判断用户是否登录-END**/
}
/**遍历用户信息List容器-END**/
}
/**检查用户是否重复登录,如果重复登录,则踢出上一次登录,保留本次登录-END**/
}
if(operationFlag.equals("Y")){
if(session.getAttribute("loginCurrUser")==null){
//("【登录主界面-封装类】踢除会话后转向页面");
forwardFlag=true;
}
}
return forwardFlag;
}
/**
* 用户退出.
*/
XXX appUser = SessionManager.getLoginUser();
if (appUser != null) {
request.getSession().invalidate();//销毁session
log.info("用户登出系统,登出用户为:" + appUser.getUserId());
}
response.sendRedirect(forwardAction);
return null;
============================2. 监听部分============================
/**
* 任何一个Session被创建或者销毁时,都会通知OnlineUserListener 这个类
* @Description: Session使用HttpSessionListener接口监听Session的创建和失效
* @ClassName OnlineUserListener
*/
public class OnlineUserListener implements HttpSessionListener{
protected final Logger log = Logger.getLogger(getClass());
/**
* 当一个浏览器第一次访问网站的时候,J2EE应用服务器会新建一个HttpSession对象 ,
* 并触发 HttpSession创建事件 ,如果注册了HttpSessionListener事件监听器,
* 则会调用HttpSessionListener事件监听器的sessionCreated方法
*/
public void sessionCreated(HttpSessionEvent event) {
// 当session建立时触发
log.info("【监听器提醒】:当session建立时触发");
}
/**
* 销毁Session
* 这个浏览器访问结束超时的时候,J2EE应用服务器会销毁相应的HttpSession对象,
* 触发 HttpSession销毁事件,同时调用所注册HttpSessionListener
* 事件监听器的sessionDestroyed方法
*/
public void sessionDestroyed(HttpSessionEvent event) {
log.info("【监听器提醒】:当session销毁时触发");
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
//从ServletContext中取得在线列表用户信息的容器
List onlineUserList = (List) application.getAttribute("onlineUserList");
onlineUserList.remove(session);
log.info("【监听器提醒】:获取上次与服务器交互时间,time: " + session.getLastAccessedTime());
}
}
============================3. 过滤部分============================
if(request.getSession().getAttribute("loginCurrUser")==null){
log.error("没有登录系统,请登录系统!");
String url = request.getRequestURL().toString();
request.setAttribute("errorAction", url.substring(0, url.lastIndexOf("/")));
return mapping.findForward("error");
}
===========================4. JSP页面部分============================
<%if(session.getAttribute("loginCurrUser")==null){%>
<script type="text/javascript">
var errorAction = '<c:out value="${errorAction}"/>';
alert("你的账号已在异地登录,你被强制下线!");
window.top.location.href='index.do?action=LoginUser';
</script>
<%}%>
首先介绍一下Cookie、Application和Session对象
1.Cookie:
Cookie 是保存到客户端的的一个文本文件,与特定的用户相关,以键---值对的形式存放
创建Cookie的方法:Cookie cookie = new Cookie(name ,value);其中name和value 都是String的类型,可以用setXXX getXXX方法设置Cookie的属性和获得属性,然后再利用HttpServletResponse的方法
addCookie(Cookie)将它设置到客户端。
利用HttpServletRequest的getCookies()方法读取客户端的所有Cookie,返回一个Cookie数组
2.Session
存储Session的两种方法:将Session写到浏览器的Cookie中
通过URL的重写
建立一个Session的方法,HttpSession mySession = request.getSession(true);
Session是写在服务器的文件,mySession 具有相应的方法设置Session的属性(比如存活时间)
通过response.encodeURL() 转码,将URL后面加上SessionId,如果浏览器没有禁用Cookie的话,就将Session写到Cookie中
3.Application
用于保存整个WebApplication的生命周期内部都可以访问的数据,即保存在服务器
在API中表现为ServletContext,通过HttpServlet的getServletContext方法可以拿到,通过ServletContext的get/setAttribute的方法取得相应的方法和设置相关的属性
Session与Application 都是通过键---值段的保存,setAttribute(name,value); name是String类型,value
是任何类型。
利用Application的方法实现网站的计数:
public class TestServletContext extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
ServletContext application = this.getServletContext();
PrintWriter pw = resp.getWriter();
Integer accessCount = (Integer)application.getAttribute("accessCount");
if(accessCount == null) {
accessCount = new Integer(0);
} else accessCount = new Integer(accessCount.intValue() + 1);
application.setAttribute("accessCount", accessCount);
pw.println("accessCount:" + accessCount.intValue());
}
}
1. 实现在线用户列表
2. 当用户在异地登录后,使前一次登录自动退出
3. 关闭浏览器,session失效,该session对应当前登录用户将会从在线列表移除,
4. 用户正常退出,session失效,该session对应当前登录用户将会从在线列表移除,
实现方法:
用户登录时,会创建一个session,用于保存用户信息。将所有用户登录时的session值与ID存入ServletContext中,显示在线列表的时候,就从ServletContext中取得用户登录的session值,从中取得用户信息。
(限制同一账号同一时刻只能一个用户登录使用向QQ一样,不能多地登录
情况一:没有登录,则将用户登录信息放置于用户在线容器列表
情况二:已登录,则判断是否异地重复登录,重复登录则踢出上一登录,将其session失效,
将最新的登录会话放置于用户在线列表中。)
1. 登录:
先从ServletContext中取出存放用户登录的session 相关信息,检查这个列表,如果已经存在相同的登录信息,则说明用户之前已经登录过,移除前面一条记录。
再把此次登录的信息加入到ServletContext中。
2.监听:
实现SessionListener类,当session失效的时候,从ServletContext中移除相应记录。
3.过滤:
过滤所有页面,sesison失效后转向登录页面。但是要实现用户二次登录后强制先前的登录失效,需要在这里控制。
登录时存入的是session值和session ID,用户二次登录时移除了前线记录,存入的session值是相同的,但是ID却不同。
当第一次登录的页面请求的时候,在这里检查ServletContext中是否存在当前的session值与ID记录。如果没有就销毁这个session。
参考代码:
存放的时候有很多中方法,我选择的是将session值与ID先存入一个List,在将这个List存到ServletContext中。
即将用户登录信息放置于用户在线容器列表,已登录,则判断是否重复登录,重复登录则踢出上一登录,将其session失效,
将最新的登录放置于用户在线列表中。
============================1. 登录部分============================
一、Struts中的Action登录校验方法
String forwardAction = LOGIN_ACTION;
boolean checkFlag=false;//是否验证通过
String userId = WebUtils.getParameter(request,"userId", null);
String userPassword = WebUtils.getParameter(request,"userPassword", null);
if (StringUtils.isNotEmpty(userId) && StringUtils.isNotEmpty(userPassword)) {
AppUser appUser = this.userService.getAppUser(userId);
if (appUser != null) {
String pass = appUser.getPassWord();
if(appUser.getIsLock()==1){
request.setAttribute("userLockError", "抱歉,该用户已经被锁定!");
} else if (appUser.getUserFlag()==2) {
request.setAttribute("userLockError", "抱歉,该用户已经被注销!");
} else if (userPassword.equals(pass)) {
checkFlag=true;
/**
* 第二:判断用户用户是否重复登录
* 限制同一账号同一时刻只能一个用户登录使用向QQ一样,不能多地登录
* 情况一:没有登录,则将用户登录信息放置于用户在线容器列表
* 情况二:已登录,则判断是否重复登录,重复登录则踢出上一登录,将其session失效,
* 将最新的登录放置于用户在线列表中。
*/
if(SessionManager.getSingleUserLoginManage(request,appUser)){
return new ActionForward("/" +forwardAction);
}else{
forwardAction = MAIN_ACTION;
}
} else {
request.setAttribute("passError", "密码错误");
}
} else {
request.setAttribute("userError", "用户名错误");
}
}
if(checkFlag){
response.sendRedirect(forwardAction);
return null;
}else{
return new ActionForward("/" +forwardAction);
}
二、校验是否重复登录公共方法
/**
* 限制同一账号同一时刻只能一个用户登录使用向QQ一样,不能多地登录
* @Description:用户在线管理控制类
* 判断用户用户是否重复登录
* 情况一:没有登录,则将用户登录信息放置于用户在线容器列表
* 情况二:已登录,则判断是否重复登录,重复登录则踢出上一登录,将其session失效,
* 将最新的登录放置于用户在线列表中。
* @param appUser
* @ReturnType boolean
* @author: QIXIAOWEI
* @Created xxxxxxxxxxxxx
*/
public static boolean getSingleUserLoginManage(HttpServletRequest request,AppUser appUser){
String operationFlag ="N";//用户是否被踢除,Y表示踢除成功,N踢除失败
boolean forwardFlag=false;//踢除重复登录用户,被踢除用户是否转向登录页面
int interval = PropertiesBean.getProperty(PARAM_SESSION_TIMEOUT, DEFUALT_SESSION_TIMEOUT);
HttpSession session = request.getSession(true);
//声明application系统公有数据
ServletContext application = (ServletContext)session.getServletContext();
//用户登录信息
session.setAttribute("loginCurrUser",appUser);
session.setAttribute("id", session.getId());
//设置session超时时间
session.setMaxInactiveInterval(interval);
//session生成时间的值
session.setAttribute("loginTime",session.getCreationTime());
/**
* 第二:判断用户用户是否重复登录
* 情况一:没有登录,则将用户登录信息放置于用户在线容器列表
* 情况二:已登录,则判断是否重复登录,重复登录则踢出上一登录,将其session失效,
* 将最新的登录放置于用户在线列表中。
*/
List onlineUserList = (List) application.getAttribute("onlineUserList");
if (onlineUserList ==null || onlineUserList.size()==0) {
/**判断用户在线容器列表是否存在,没有则创建一个并放入ServletContext **/
onlineUserList = new ArrayList();
application.setAttribute("onlineUserList", onlineUserList);
/**将登录用户会话信息,并设置到ServletContext中用户在线容器List中**/
onlineUserList.add(session);
}else {
/**检查用户是否重复登录,如果重复登录,则踢出上一次登录,保留本次登录-START**/
if(onlineUserList!=null && onlineUserList.size()>0){
/**遍历用户信息List容器-START**/
for(int i=0;i<onlineUserList.size();i++){
/**分别取出在线列表中的每一个登录会话信息**/
HttpSession obj = (HttpSession)onlineUserList.get(i);
/**
* 判断用户是否重复登录
* 如果存在就返回当前的会话。如果参数是false,
* 那么在request的当前会话不存在的时候就返回null
***/
boolean clearFlag=false;//如果重复登录,踢除上一次,处理用户刷新
/**取出application对象中放置的会话信息集合某个属性,与当前新登录会话信息属性进行比较-判断用户是否登录-START**/
if(request.getSession(false)!=null && obj!=null){
if(session.getAttribute("loginCurrUser")!=null && obj.getAttribute("loginCurrUser")!=null){
AppUser AppUserOne=(AppUser)obj.getAttribute("loginCurrUser");
AppUser AppUserTwo=(AppUser)session.getAttribute("loginCurrUser");
if((AppUserOne!=null && AppUserTwo!=null) && ((AppUserOne.getUserId()).equals(AppUserTwo.getUserId()))){
if(obj.getAttribute("loginTime")!=null && session.getAttribute("loginTime")!=null){
/**在线列表中该用户上次session生成时间**/
long obj_time = Long.parseLong(obj.getAttribute("loginTime").toString());
/**当前该用户新会话session生成时间的值**/
long session_time = Long.parseLong(session.getAttribute("loginTime").toString());
/**session生成时间转换成日期-START**/
Date firstDate=new Date(obj_time);//
Date secondDate=new Date(session_time);
//前面的MM一定要大写,表示月份,后面的mm小写,表示分钟
//SimpleDateFormat firstFormat=new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
//SimpleDateFormat secondFormat=new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
/**session生成时间转换成日期-END**/
/**
* 特殊情况控制,用户同一浏览器登录-,虽然登录时间不同
* 但为同一用户,不再向用户在线列表中增加值
**************************************************
* 如果非要控制同一账户同一系统,同一浏览也不允许登录,则需要重新
* 执行下面踢除操作,并重新执行第一步,重新生成会话
**************************************************
***/
clearFlag=true;
/**
* 在满足全局对象‘用户对象标识值’与新登录用户标识值相同的情况下
* 将application对象中的会话属性(session生成时间的值)与新的会话属性进行比较
* 如果旧的会话生成时间小于新的会话生成时间,则表示该用户已经登录
******************************************************
*如果成功页面用的是转发不是重定向,该句需要放开,涉及到刷新
* -START**/
//if(obj_time<session_time && DateUtils.isBefore(firstDate, secondDate)){
/**将新的会话放置于集合中**/
onlineUserList.add(session);
obj.invalidate();//销毁原来的session
operationFlag="Y";
break;
//}
}
}
}
}
/**没有重复的,即正常登录,将登录会话放于集合中,用于登录后页面刷新**/
if(!clearFlag){
onlineUserList.add(session);
break;
}
/**取出application对象中放置的会话信息集合某个属性,与当前新登录会话信息属性进行比较-判断用户是否登录-END**/
}
/**遍历用户信息List容器-END**/
}
/**检查用户是否重复登录,如果重复登录,则踢出上一次登录,保留本次登录-END**/
}
if(operationFlag.equals("Y")){
if(session.getAttribute("loginCurrUser")==null){
//("【登录主界面-封装类】踢除会话后转向页面");
forwardFlag=true;
}
}
return forwardFlag;
}
/**
* 用户退出.
*/
XXX appUser = SessionManager.getLoginUser();
if (appUser != null) {
request.getSession().invalidate();//销毁session
log.info("用户登出系统,登出用户为:" + appUser.getUserId());
}
response.sendRedirect(forwardAction);
return null;
============================2. 监听部分============================
/**
* 任何一个Session被创建或者销毁时,都会通知OnlineUserListener 这个类
* @Description: Session使用HttpSessionListener接口监听Session的创建和失效
* @ClassName OnlineUserListener
*/
public class OnlineUserListener implements HttpSessionListener{
protected final Logger log = Logger.getLogger(getClass());
/**
* 当一个浏览器第一次访问网站的时候,J2EE应用服务器会新建一个HttpSession对象 ,
* 并触发 HttpSession创建事件 ,如果注册了HttpSessionListener事件监听器,
* 则会调用HttpSessionListener事件监听器的sessionCreated方法
*/
public void sessionCreated(HttpSessionEvent event) {
// 当session建立时触发
log.info("【监听器提醒】:当session建立时触发");
}
/**
* 销毁Session
* 这个浏览器访问结束超时的时候,J2EE应用服务器会销毁相应的HttpSession对象,
* 触发 HttpSession销毁事件,同时调用所注册HttpSessionListener
* 事件监听器的sessionDestroyed方法
*/
public void sessionDestroyed(HttpSessionEvent event) {
log.info("【监听器提醒】:当session销毁时触发");
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
//从ServletContext中取得在线列表用户信息的容器
List onlineUserList = (List) application.getAttribute("onlineUserList");
onlineUserList.remove(session);
log.info("【监听器提醒】:获取上次与服务器交互时间,time: " + session.getLastAccessedTime());
}
}
============================3. 过滤部分============================
if(request.getSession().getAttribute("loginCurrUser")==null){
log.error("没有登录系统,请登录系统!");
String url = request.getRequestURL().toString();
request.setAttribute("errorAction", url.substring(0, url.lastIndexOf("/")));
return mapping.findForward("error");
}
===========================4. JSP页面部分============================
<%if(session.getAttribute("loginCurrUser")==null){%>
<script type="text/javascript">
var errorAction = '<c:out value="${errorAction}"/>';
alert("你的账号已在异地登录,你被强制下线!");
window.top.location.href='index.do?action=LoginUser';
</script>
<%}%>
首先介绍一下Cookie、Application和Session对象
1.Cookie:
Cookie 是保存到客户端的的一个文本文件,与特定的用户相关,以键---值对的形式存放
创建Cookie的方法:Cookie cookie = new Cookie(name ,value);其中name和value 都是String的类型,可以用setXXX getXXX方法设置Cookie的属性和获得属性,然后再利用HttpServletResponse的方法
addCookie(Cookie)将它设置到客户端。
利用HttpServletRequest的getCookies()方法读取客户端的所有Cookie,返回一个Cookie数组
2.Session
存储Session的两种方法:将Session写到浏览器的Cookie中
通过URL的重写
建立一个Session的方法,HttpSession mySession = request.getSession(true);
Session是写在服务器的文件,mySession 具有相应的方法设置Session的属性(比如存活时间)
通过response.encodeURL() 转码,将URL后面加上SessionId,如果浏览器没有禁用Cookie的话,就将Session写到Cookie中
3.Application
用于保存整个WebApplication的生命周期内部都可以访问的数据,即保存在服务器
在API中表现为ServletContext,通过HttpServlet的getServletContext方法可以拿到,通过ServletContext的get/setAttribute的方法取得相应的方法和设置相关的属性
Session与Application 都是通过键---值段的保存,setAttribute(name,value); name是String类型,value
是任何类型。
利用Application的方法实现网站的计数:
public class TestServletContext extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
ServletContext application = this.getServletContext();
PrintWriter pw = resp.getWriter();
Integer accessCount = (Integer)application.getAttribute("accessCount");
if(accessCount == null) {
accessCount = new Integer(0);
} else accessCount = new Integer(accessCount.intValue() + 1);
application.setAttribute("accessCount", accessCount);
pw.println("accessCount:" + accessCount.intValue());
}
}
发表评论
-
诊断Java代码中常见的数据库性能热点问题
2016-09-01 11:49 577当我在帮助一些开发 ... -
java 将汉字转换为全拼及返回中文的首字母-带JAR包
2014-12-22 15:59 881import net.sourceforge.pinyin4 ... -
JSON中,java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher问题解决
2014-09-07 16:31 1194使用JSON,在SERVLET或者STRUTS的ACTION ... -
java 的 文件、文件夹 的建立、删除、复制以及移动等功能 操作
2014-08-23 09:00 717package util; import java. ... -
Java中sleep()与wait()的区别
2014-08-23 08:58 448一种解释: 功能差不 ... -
Java关键字final、static使用总结
2014-07-31 21:43 380一、final 根据程序上下文环境,Java关 ... -
Java 泛型 .
2014-07-02 23:17 694class Person{ private String n ... -
HashMap<String,HashMap<String,String>> 的多级映射 .
2014-07-02 23:13 1589package namespace;import java.u ... -
synchronized 和ThreadLocal 区别
2014-05-14 22:03 1128看了N个贴子,ThreadLocal讲得都不是很清楚,纠缠与 ... -
JAVA 常用加密方法
2014-05-10 18:45 10301.Base64 加密:org.apache.common ... -
Java二维数组的声明和初始化
2014-03-18 22:39 30041.二维数组可以看成以数组为元素的数组; 2.Java中二维数 ... -
POI操作Excel常用方法总结
2014-03-10 21:29 946一、POI简介 Apache POI是Apac ... -
JAVA垃圾回收机制,如何优化程序
2014-02-12 12:15 995虽然程序员无法控制JVM的垃圾回收机制。但是可以通过编程的手段 ... -
HTTPClient PostMethod 中文乱码问题解决方案(2种)
2014-02-20 21:28 2319不过在实际使用中, 还是发现按照最基本的方式调用 Http ... -
List,set,Map 的用法和区别
2014-02-09 15:23 828Collection├List│├LinkedList│├Ar ... -
Object转Map Map->list array->list list->Map
2013-12-18 21:31 633Map map1= new HashMap(); map ... -
java List 排序 Collections.sort() 对 List 排序
2013-12-19 22:20 871//一个POJO例子class User { String ... -
SSH框架中使用log4j的方便之处
2013-12-14 13:39 712SSH框架中使用log4j的方便之处 1. 动态的改变记 ... -
无序hashset与hashmap让其有序
2013-12-14 13:39 3382今天迭代hashmap时,hashmap并不能按照put的 ... -
JSON 字符串 与 java 对象的转换
2013-12-04 22:52 447<!-- 正文结束 --> // 引入相 ...
相关推荐
J2EE限制同一账号同一时刻只能一个用户登录使用,向QQ一样,可以提示先前登录的用户“账号被异地登录,强迫下线”
MyEclipse+mysql+Ajax工具,解决用户同一时段不能重复登录,第二次登录将会挤掉第一次登录用户,弹出消息框(你已在其他地方登录,被迫下线),我也是借鉴其他大师 然后自己整理的。基本逻辑是:用户登录时候检测...
最近做了企业项目,其中有这样的需求要求同一帐号同一时间只能一个地点登陆类似QQ登录的功能。下面小编通过本文给大家分享实现思路,感兴趣的朋友参考下吧
发现对于登录问题的解决都说用session监听,但是没有人写出示例代码,今天写了一个,希望对大家有所帮助. 解决同名用户登录的问题,类似QQ,即同名用户第二次登录,第一次登录的用户就掉线.
对于一个帐号在同一时间只能一个人登录,下文给大家介绍的非常详细,对java web qq 登录功能感兴趣的朋友一起看看吧
有些情况下你也许会由这样的一个需求,就是限制同一个账号在不同地点上面重复登录,就像QQ一样,一个账号只能一个人登录,别人登录你的账号的话,那你这边就会提示“已在别处登录”并强制登出。 其实实现起来不是很...
因此我们有些时候需要在电脑中设置IE浏览器取消Session共享实现登录不同账号,(网吧N年前解决问题如:QQ农场出现只能用一个QQ偷菜也是此道理,解决以后可以多个QQ登陆,多个账号操作),不废话告诉解决办法本人整理...
单点登陆,实现同账户登陆,会把上一个给挤掉代码,上一个操作时会给出挤掉的提示消息
java Web 同一个用户名不能同时登陆的思路 .doc java web开发一个帐号同一时间只能一个人登录 .doc java web中实现同一帐号同一...java中如何实现同一账号不能同时登录.doc session保证两用户不能同时登陆一个账号.doc
主要介绍了Java web实现账号单一登录,防止同一账号重复登录,有点类似于qq登录踢人效果,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
实现同一个账户同一时间只能在一个地方登录,如腾讯QQ,当你的账户在另一个终端登录后,之前正在登录访问的终端会被强制下线。
1.放在QQ.EXE同一目录下,重启QQ生效; 2.手动输入密码有效,自动登录无效; 3.适用于QQ2012Bata2、QQ2012Bata3(无安全防护)、QQ2012正式版,其他版本未测试; 3.本插件无毒,一切杀软、卫士须加入白名单; 4....
通过三方登录可以使用微信、QQ等第三方账号登录系统,方便用户使用;通过支付功能可以使用支付宝、微信支付等第三方支付方式,提高支付的安全性和便捷性;通过短信功能可以使用第三方短信平台发送短信,方便用户接收...
● 多线程登录QQ查询DNF是否被限制 3、什么是多线程 4、堆内存、栈内存 5、同一进程的线程共享的资源和独有的资源 第二节 多线程支持库命令1 1、启动线程 2、等待线程 3、强制关闭线程 4、关闭线程句柄 第三节 多...
1、同一账号同一时间内在多个地方进行登录; 2、不同的账号同一时间在同一台机上登录; 3、输入错误的账户名称或密码进行登录; 4、在某账号在线的情况下,删除或修改其权限或信息,且改动的数据正被使用;
97酷5综合生活门户系统是一个整站程序,综合20多个频道,丰富网站内容。拥有 图片新闻、在线问答、房产、博客(微博)团购、在线商城等特色频道。程序简介页面简介大方支持全站静态与伪静态生成,提高网页访问速度,...
能随意修改电脑的MAC,再也不用担心上网账号绑定电脑问题,还可以多人使用同一账号哦 有任何技术问题请联系资源主QQ:908599713
私钥单独保存在客户端一个文件夹下不进行传输;能显示用户名、邮箱不符合格式规范或者重复,空输入等错误信息。 2. 认证登录:客户端与集中服务器通信完成用户名、口令认证登录;能显示用户名、密码错误导致的登录...
(5)、支付设置,用户可以在此选择站点交易所使用的支付接口,并能设置账号、密钥等相应信息 (6)、数据备份恢复,站点数据的备份 (7)、图片水印缩略图,用户可以对图片进行水印及缩略图操作 (8)、广告工具...
(5)、支付设置,用户可以在此选择站点交易所使用的支付接口,并能设置账号、密钥等相应信息 (6)、数据备份恢复,站点数据的备份 (7)、图片水印缩略图,用户可以对图片进行水印及缩略图操作 (8)、广告工具...