锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
1 錛庡湪鐢ㄦ埛鐧誨綍鏃訛紝鎶婄敤鎴鋒坊鍔犲埌涓涓?span>ArrayList涓?/span>
2 錛庡啀嬈$櫥褰曟椂鏌ョ湅ArrayList涓湁娌℃湁璇ョ敤鎴鳳紝濡傛灉ArrayList涓凡緇忓瓨鍦ㄨ鐢ㄦ埛錛屽垯闃繪鍏剁櫥褰?/span>
3 錛庡綋鐢ㄦ埛閫鍑烘椂錛岄渶瑕佷粠璇?span>ArrayList涓垹闄よ鐢ㄦ埛錛岃繖鍙堝垎涓轟笁縐嶆儏鍐?/span>
鈶?/span> 浣跨敤娉ㄩ攢鎸夐挳姝e父閫鍑?/span>
鈶?/span> 鐐瑰嚮嫻忚鍣ㄥ叧闂寜閽垨鑰呯敤Alt+F4閫鍑猴紝鍙互鐢?span>javascript鎹曟崏璇ラ〉闈㈠叧闂簨浠訛紝
鎵ц涓孌?span>java鏂規硶鍒犻櫎ArrayList涓殑鐢ㄦ埛
鈶?/span> 闈炴甯擱鍑猴紝姣斿瀹㈡埛绔郴緇熷穿婧冩垨紿佺劧姝繪満錛屽彲浠ラ噰鐢ㄩ殧涓孌墊椂闂?span>session娌℃椿鍔ㄥ氨鍒犻櫎璇?span>session鎵瀵瑰簲鐨勭敤鎴鋒潵瑙e喅錛岃繖鏍風敤鎴烽渶瑕佺瓑寰呬竴孌墊椂闂翠箣鍚庡氨鍙互姝e父鐧誨綍銆?/span>
鍦?span>LoginAction涓畾涔夛細
// 鐢ㄦ潵鍦ㄦ湇鍔″櫒绔瓨鍌ㄧ櫥褰曠殑鎵鏈夊笎鍙?/span>
public static List logonAccounts;
login() 鐧誨綍鏂規硶涓細
// 璁劇疆session涓嶆椿鍔ㄦ椂闂翠負30鍒?/span>
request.getSession().setMaxInactiveInterval(60*30);
if(logonAccounts==null){
logonAccounts = new ArrayList();
}
// 鏌ョ湅ArrayList涓湁娌℃湁璇ョ敤鎴?/span>
for (int i = 0; i < logonAccounts.size(); i++) {
Account existAccount = (Account)logonAccounts.get(i);
if(account.getAccountId().equals(existAccount.getAccountId())){
return "denied";
}
}
// 鍦ㄧ敤鎴風櫥褰曟椂錛屾妸sessionId娣誨姞鍒頒竴涓?span>account瀵硅薄涓?/span>
// 鍦ㄥ悗闈?/span> 鈶?闇瑕佹牴鎹sessionId鍒犻櫎鐩稿簲鐢ㄦ埛
account.setSessionId(request.getSession().getId());
// 璇ョ敤鎴蜂繚瀛樺埌ArrayList闈欐佺被鍙橀噺涓?/span>
logonAccounts.add(account);
return "login";
鈶?浣跨敤娉ㄩ攢鎸夐挳姝e父閫鍑?/span>
logout() 閫鍑烘柟娉曚腑錛?/span>
if(logonAccounts==null){
logonAccounts = new ArrayList();
}
// 鍒犻櫎ArrayList涓殑鐢ㄦ埛 鈶?/span>
for (int i = 0; i < logonAccounts.size(); i++) {
Account existAccount = (Account)logonAccounts.get(i);
if(account.getAccountId().equals(existAccount.getAccountId())){
logonAccounts.remove(account);
}
}
鈶?鐐瑰嚮嫻忚鍣ㄥ叧闂寜閽垨鑰呯敤Alt+F4閫鍑猴細
鍦ㄥ悗鍙板脊鍑轟竴涓獥鍙o紝鍦ㄥ脊鍑虹獥鍙d腑鍒犻櫎ArrayList涓殑鐢ㄦ埛
function window.onbeforeunload(){
// 鏄惁閫氳繃鍏抽棴鎸夐挳鎴栬呯敤Alt+F4閫鍑?/span>
// 濡傛灉涓哄埛鏂拌Е鍙?span>onbeforeunload浜嬩歡錛屼笅闈?span>if
璇彞涓嶆墽琛?/span>if (event.clientX>document.body.clientWidth && event.clientY<0||event.altKey){
window.open('accountUnbound.jsp','',
'height=0,width=0,top=10000,left=10000')
}
}
accountUnbound.jsp : 寮瑰嚭紿楀彛涓垹闄?span>ArrayList涓殑鐢ㄦ埛
<%
Account account = (Account) request.getSession().getAttribute("account");
if(account != null){
if(LoginAction.logonAccounts==null){
LoginAction.logonAccounts = new ArrayList();
}
// 鍒犻櫎ArrayList涓殑鐢ㄦ埛鈥斺斾笅闈唬鐮佸拰涓婇潰鐨?/span> 鈶?/span> 澶勪竴鏍?/span>
for (int i = 0; i < logonAccounts.size(); i++) {
Account existAccount = (Account)logonAccounts.get(i);
if(account.getAccountId().equals(existAccount.getAccountId())){
logonAccounts.remove(account);
}
}
}
%>
涓轟簡淇濊瘉涓婇潰浠g爜鍙互鎵ц瀹屾瘯錛?span>3縐掑悗鍏抽棴姝ゅ脊鍑虹獥鍙o紙涔熶綅浜?span>accountUnbound.jsp涓級
<script>
setTimeout("closeWindow();",3000);
function closeWindow(){
window.close();
}
</script>
鈶?浣?span>LoginAction 瀹炵幇implements HttpSessionListener錛屽茍瀹炵幇sessionCreated錛?span>sessionDestroyed鏂規硶錛屽湪sessionDestroyed涓垹闄?span>ArrayList涓殑鐢ㄦ埛錛堢敤鎴瘋秴榪?span>30鍒嗛挓涓嶆椿鍔ㄥ垯鎵ц姝ゆ柟娉曪級
public void sessionDestroyed(HttpSessionEvent event) {
// 鍙栧緱涓嶆椿鍔ㄦ椂鐨?span>sessionId,騫舵牴鎹叾鍒犻櫎鐩稿簲logonAccounts涓殑鐢ㄦ埛
String sessionId = event.getSession().getId();
for (int i = 0; i < logonAccounts.size(); i++) {
Account existAccount = (Account)logonAccounts.get(i);
if(account.getSessionId().equals(existAccount.getSessionId())){
logonAccounts.remove(account);
}
}
}
娉細
瀵逛簬涓婇潰鐨勶紝鐢變簬寮瑰嚭紿楀彛寰堝鏄撹闃茬伀澧欐垨鑰呭畨鍏ㄨ蔣浠墮樆鎷︼紝閫犳垚鏃犳硶寮瑰嚭紿楀彛錛屼粠鑰岀煭鏃墮棿涓嶈兘鐧誨綍錛岃繖縐嶆儏鍐靛彲浠ョ敤AJAX鏉ヤ唬鏇垮脊鍑虹獥鍙o紝鍚屾牱鍦ㄥ悗鍙版墽琛屽垹闄ょ敤鎴風殑閭f浠g爜錛屽嵈涓嶄細鍙楀埌闃茬伀澧欓檺鍒訛細
<script>
// <![CDATA[
var http_request = false;
function makeRequest(url) {
http_request = false;
if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
}
}
}
if (!http_request) {
alert('Giving up :( Cannot create an XMLHTTP instance');
return false;
}
http_request.onreadystatechange = alertContents;
http_request.open('GET', url, true);
http_request.send(null);
}
function alertContents() {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
window.close();
} else {
alert('There was a problem with the request.');
}
}
}
function window. onbeforeunload() {
makeRequest ('accountUnbound.jsp');
}
//]]>
</script>
瀵逛簬涓婇潰鐨勮繖孌?span>ajax浠g爜錛屽湪緗戜笂鏈夊緢澶氳緇嗙殑瑙i噴錛屾妸瀹冨姞鍒?strong>onbeforeunload()嫻忚鍣ㄥ叧闂簨浠朵腑錛屽湪鍚庡彴鎵ц浠g爜鐨勬晥鏋滃緢濂斤紝涓嶅繀鎷呭績寮瑰嚭紿楀彛鏈夋椂鍊欎細鏃犳晥鐨勯棶棰?/span>銆?/span>
浣跨敤榪欐浠g爜鍚庯紝涓婇潰鈶?/span>涓?span>accountUnbound.jsp涓殑閭f鍏抽棴寮瑰嚭紿楀彛window.close();鐨?span>js浠g爜灝變笉闇瑕佷簡銆?/span>