<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/post//</link>
<title><![CDATA[web在线踢人小程序，确保用户只能在一台电脑保持登录状态]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[Web开发]]></category>
<pubDate>Sun, 30 Mar 2014 08:59:15 +0000</pubDate> 
<guid>https://www.heckjj.com/post//</guid> 
<description>
<![CDATA[ 
	已经离职有段时间了， 突然记起来还一个小功能没做， 想想也挺简单，留下代码和思路给同事做个参考。<br/><br/>换工作心里挺忐忑， 对未来也充满了憧憬与担忧。（虽然已是老人， 换了N次工作了，但每次心里都和忐忑）。<br/><br/>写写代码反而心里平静了很多。入正题，上思路，其实很简单<br/><br/>一、场景<br/><br/>用户u1只能在A电脑登录，当在B电脑登录时，A电脑登录状态被取消<br/><br/>二、思路<br/><br/>1.创建一个session监听器去监听session属性的创建<br/><br/>2，用个map储存（如果用户量大可以用KV数据库，如redis之类），K 为用户名， V为session的<br/><br/>3. 当检测到session的属性 userName添加时，把对应的session中userName属性清空<br/><br/><br/>三、主要代码<br/><textarea name="code" class="java" rows="15" cols="100">
package tk.hecks.login;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
/**
 * 用于监听session属性的添加
 * 
 *
 */
public class LoginListener implements HttpSessionAttributeListener &#123;
&nbsp;&nbsp;&nbsp;&nbsp;// 已经登录用户session
&nbsp;&nbsp;&nbsp;&nbsp;public static Map&lt;String, HttpSession&gt; loginedUser = new HashMap&lt;String, HttpSession&gt;();

&nbsp;&nbsp;&nbsp;&nbsp;public void attributeAdded(HttpSessionBindingEvent eventAdd) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// TODO 监听session属性的添加
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String attrName = eventAdd.getName();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 监听到为属性userName的添加
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (&quot;userName&quot;.equals(attrName)) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String value = (String) eventAdd.getValue();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpSession session = loginedUser.get(value);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (session != null) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.removeAttribute(attrName);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loginedUser.put(value, eventAdd.getSession());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;public void attributeRemoved(HttpSessionBindingEvent arg0) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// TODO Auto-generated method stub

&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;public void attributeReplaced(HttpSessionBindingEvent arg0) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// TODO Auto-generated method stub

&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&#125;</textarea><br/><br/>四、效果<br/><br/>可以用chrome模拟A电脑， IE模拟B电脑<br/><br/>第一次用chrome 登录，显示成功，刷新还是成功<br/><br/>第二次用IE登录，成功<br/><br/>此时chrome再次刷新，返回登录页面<br/><br/> <br/><br/>整个项目代码地址 <br/><br/>https://github.com/bensonHe/LoginOnlyOne<br/><br/>下下来访问<br/><br/>http://localhost:端口/LoginOnlyOne<br/>Tags - <a href="https://www.heckjj.com/tags/httpsessionattributelistener/" rel="tag">httpsessionattributelistener</a> , <a href="https://www.heckjj.com/tags/%25E7%2594%25A8%25E6%2588%25B7%25E5%258F%25AA%25E8%2583%25BD%25E5%259C%25A8%25E4%25B8%2580%25E5%258F%25B0%25E7%2594%25B5%25E8%2584%2591%25E4%25BF%259D%25E6%258C%2581%25E7%2599%25BB%25E5%25BD%2595%25E7%258A%25B6%25E6%2580%2581/" rel="tag">用户只能在一台电脑保持登录状态</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/post//#blogcomment</link>
<title><![CDATA[[评论] web在线踢人小程序，确保用户只能在一台电脑保持登录状态]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>