﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-和家人在一起的日子--快乐-文章分类-Java</title><link>http://www.blogjava.net/daipan/category/20436.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 19 Jun 2007 08:21:39 GMT</lastBuildDate><pubDate>Tue, 19 Jun 2007 08:21:39 GMT</pubDate><ttl>60</ttl><item><title>一个帐号同一时间只能一个人登录 </title><link>http://www.blogjava.net/daipan/articles/125102.html</link><dc:creator>飞翔的心</dc:creator><author>飞翔的心</author><pubDate>Tue, 19 Jun 2007 05:12:00 GMT</pubDate><guid>http://www.blogjava.net/daipan/articles/125102.html</guid><wfw:comment>http://www.blogjava.net/daipan/comments/125102.html</wfw:comment><comments>http://www.blogjava.net/daipan/articles/125102.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/daipan/comments/commentRss/125102.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/daipan/services/trackbacks/125102.html</trackback:ping><description><![CDATA[<p><span>对于一个帐号在同一时间只能一个人登录，可以通过下面的方法实现：</span> </p>
<p><span>1</span> <span>．在用户登录时，把用户添加到一个<span>ArrayList</span>中</span> </p>
<p><span>2</span> <span>．再次登录时查看<span>ArrayList</span>中有没有该用户，如果<span>ArrayList</span>中已经存在该用户，则阻止其登录</span> </p>
<p><span>3</span> <span>．当用户退出时，需要从该<span>ArrayList</span>中删除该用户，这又分为三种情况</span> </p>
<p><strong><span>①</span> </strong><span>使用注销按钮正常退出</span> </p>
<p><strong><span>②</span> </strong><span>点击浏览器关闭按钮或者用<span>Alt+F4</span>退出，可以用<span>javascript</span>捕捉该页面关闭事件，</span> </p>
<p><span>执行一段<span>java</span>方法删除<span>ArrayList</span>中的用户</span> </p>
<p><strong><span>③</span> </strong><span>非正常退出，比如客户端系统崩溃或突然死机，可以采用隔一段时间<span>session</span>没活动就删除该<span>session</span>所对应的用户来解决，这样用户需要等待一段时间之后就可以正常登录。</span> </p>
<p>&nbsp;</p>
<p><span>在<span>LoginAction</span>中定义：</span> </p>
<p><span>// </span><span>用来在服务器端存储登录的所有帐号</span> </p>
<p><span>public static List logonAccounts;</span> </p>
<p>&nbsp;</p>
<p><span>login()</span> <span>登录方法中：</span> </p>
<p><span>// </span><span>设置<span>session</span>不活动时间为<span>30</span>分</span> </p>
<p><span>request.getSession().setMaxInactiveInterval(60*30);</span> </p>
<p><span>if(logonAccounts==null){</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>logonAccounts = new ArrayList();</span> </p>
<p><span>}</span> </p>
<p><span>// </span><span>查看<span>ArrayList</span>中有没有该用户</span> </p>
<p><span>for (int i = 0; i &lt; logonAccounts.size(); i++) {</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>Account existAccount = (Account)logonAccounts.get(i);</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>if(account.getAccountId().equals(existAccount.getAccountId())){</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return "denied";</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>}</span> </p>
<p><span>}</span> </p>
<p><span>// </span><span>在用户登录时，把<span>sessionId</span>添加到一个<span>account</span>对象中</span> </p>
<p><span>// </span><span>在后面</span> <strong><span>③ </span></strong><span>需要根据此<span>sessionId</span>删除相应用户</span> </p>
<p><span>account.setSessionId(request.getSession().getId());</span> </p>
<p><span>// </span><span>该用户保存到<span>ArrayList</span>静态类变量中</span> </p>
<p><span>logonAccounts.add(account);</span> </p>
<p><span>return "login";</span> </p>
<p>&nbsp;</p>
<p><strong><span>① </span></strong><span>使用注销按钮正常退出</span> </p>
<p><span>logout()</span> <span>退出方法中：</span> </p>
<p><span>if(logonAccounts==null){</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>logonAccounts = new ArrayList();</span> </p>
<p><span>}</span> </p>
<p><span>// </span><span>删除<span>ArrayList</span>中的用户 </span><strong><span>&nbsp;⑴</span> </strong></p>
<p><span>for (int i = 0; i &lt; logonAccounts.size(); i++) {</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>Account existAccount = (Account)logonAccounts.get(i);</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>if(account.getAccountId().equals(existAccount.getAccountId())){</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>logonAccounts.remove(account);</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>}</span> </p>
<p><span>}</span> </p>
<p>&nbsp;</p>
<p><strong><span>② </span></strong><span>点击浏览器关闭按钮或者用<span>Alt+F4</span>退出：</span> </p>
<span>
<p><span>在后台弹出一个窗口，在弹出窗口中删除<span>ArrayList</span>中的用户</span> </p>
<p align=left><span>function window.onbeforeunload(){</span> </p>
<p align=left><span>// </span><span>是否通过关闭按钮或者用<span>Alt+F4</span>退出</span> </p>
<p align=left><span>// </span><span>如果为刷新触发<span>onbeforeunload</span>事件，下面<span>if</span>语句不执行</span> </p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>if (event.clientX&gt;document.body.clientWidth &amp;&amp; event.clientY&lt;0||event.altKey){</span> </p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>window.open('accountUnbound.jsp','',</span> </p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>'height=0,width=0,top=10000,left=10000')</span> </p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>}</span> </p>
<p align=left><span>}</span> </p>
<p>&#160;</p>
</span>
<p>&nbsp;</p>
<p><span>accountUnbound.jsp</span> <span>:</span> <span>弹出窗口中删除<span>ArrayList</span>中的用户</span> </p>
<p><span>&lt;%</span> </p>
<p><span><span>&nbsp;&nbsp; </span>&nbsp;Account account = (Account) request.getSession().getAttribute("account");</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>if(account != null){</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(LoginAction.logonAccounts==null){</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>LoginAction.logonAccounts = new ArrayList();</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>// </span></span><span>删除<span>ArrayList</span>中的用户——下面代码和上面的</span> <strong><span>⑴</span> </strong><span>处一样</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>for (int i = 0; i &lt; logonAccounts.size(); i++) {</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Account existAccount = (Account)logonAccounts.get(i);</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(account.getAccountId().equals(existAccount.getAccountId())){</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>logonAccounts.remove(account);</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span> </p>
<p><span><span>&nbsp;&nbsp; </span>&nbsp;}</span> </p>
<p><span>%&gt;</span> </p>
<p><span>为了保证上面代码可以执行完毕，<span>3</span>秒后关闭此弹出窗口（也位于<span>accountUnbound.jsp</span>中）</span> </p>
<p><span>&lt;script&gt;</span> </p>
<p><span>setTimeout("closeWindow();",3000);</span> </p>
<p><span>function closeWindow(){</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>window.close();</span> </p>
<p><span>}</span> </p>
<p><span>&lt;/script&gt;</span> </p>
<p>&nbsp;</p>
<p align=left><strong><span>③ </span></strong><span>使<span>LoginAction </span>实现<span>implements HttpSessionListener</span>，并实现<span>sessionCreated</span>，<span>sessionDestroyed</span>方法，在<span>sessionDestroyed</span>中删除<span>ArrayList</span>中的用户（用户超过<span>30</span>分钟不活动则执行此方法）</span> </p>
<p><span>public void sessionDestroyed(HttpSessionEvent event) {</span> </p>
<p><span><span>&nbsp;&nbsp; </span><span>// </span></span><span>取得不活动时的<span>sessionId,</span>并根据其删除相应<span>logonAccounts</span>中的用户</span> </p>
<p><span><span>&nbsp;&nbsp; </span>String sessionId = event.getSession().getId();</span> </p>
<p><span><span>&nbsp;&nbsp; </span>for (int i = 0; i &lt; logonAccounts.size(); i++) {</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Account existAccount = (Account)logonAccounts.get(i);</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(account.getSessionId().equals(existAccount.getSessionId())){</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>logonAccounts.remove(account);</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span> </p>
<p><span><span>&nbsp;&nbsp; </span>}</span> </p>
<p><span>}</span> </p>
<p>&nbsp;</p>
<p><strong><span>注：</span> </strong></p>
<p><span>对于上面的，由于弹出窗口很容易被防火墙或者安全软件阻拦，造成无法弹出窗口，从而短时间不能登录，这种情况可以用<span>AJAX</span>来代替弹出窗口，同样在后台执行删除用户的那段代码，却不会受到防火墙限制：</span> </p>
<p><span>&lt;script&gt;</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>// &lt;![CDATA[</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>var http_request = false;</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>function <span>makeRequest</span>(url) {</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>http_request = false;</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (window.XMLHttpRequest) { // Mozilla, Safari,...</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>http_request = new XMLHttpRequest();</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (http_request.overrideMimeType) {</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>http_request.overrideMimeType('text/xml');</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>} else if (window.ActiveXObject) { // IE</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>try {</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span>http_request = new ActiveXObject("Msxml2.XMLHTTP");</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>} catch (e) {</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>try {</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>http_request = new ActiveXObject("Microsoft.XMLHTTP");</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>} catch (e) {</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;if (!http_request) {</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>alert('Giving up :( Cannot create an XMLHTTP instance');</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return false;</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>http_request.onreadystatechange = alertContents;</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>http_request.open('GET', url, true);</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>http_request.send(null);</span> </p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>}</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>function alertContents() {</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (http_request.readyState == 4) {</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (http_request.status == 200) {</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>window.close();</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>} else {</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>alert('There was a problem with the request.');</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>}</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span> </p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>}</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>function window.</span> <strong><span>onbeforeunload()</span> </strong><span>{</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>makeRequest</span> <span>('accountUnbound.jsp');</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>}</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>//]]&gt;</span> </p>
<p><span>&lt;/script&gt;</span> </p>
<p>&nbsp;</p>
<p><span>对于上面的这段<span>ajax</span>代码，在网上有很多详细的解释，把它加到<strong><span>onbeforeunload()</span></strong>浏览器关闭事件中，在后台执行代码的效果很好，<span>不必担心弹出窗口有时候会无效的问题</span>。</span> </p>
<p>&nbsp;</p>
<p><span>使用这段代码后，上面<strong><span>②</span></strong>中<span>accountUnbound.jsp</span>中的那段关闭弹出窗口<span>window.close();</span>的<span>js</span>代码就不需要了。</span></p>
<img src ="http://www.blogjava.net/daipan/aggbug/125102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/daipan/" target="_blank">飞翔的心</a> 2007-06-19 13:12 <a href="http://www.blogjava.net/daipan/articles/125102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>