ในฐานะดาวรุ่งพุ่งแรง JSP สามารถดำรงตำแหน่งบางอย่างในสภาพแวดล้อมการเขียนโปรแกรมเซิร์ฟเวอร์ ซึ่งเกี่ยวข้องอย่างใกล้ชิดกับการสนับสนุนที่ดีสำหรับมาตรฐานอุตสาหกรรมต่างๆ เซสชันเป็นหนึ่งในโครงสร้างพื้นฐานที่มีให้ ในฐานะโปรแกรมเมอร์ คุณสามารถใช้การจัดการผู้ใช้ตามเซสชันง่ายๆ ได้อย่างง่ายดาย โดยไม่ต้องกังวลเกี่ยวกับวิธีการใช้งานบนไคลเอนต์ มีวิธีต่างๆ สองสามวิธีในการจัดการกับผู้ใช้ออนไลน์ในปัจจุบัน
หนึ่งคือผู้ใช้จะควบคุมการรีเฟรชหน้า และเซิร์ฟเวอร์จะควบคุมการหมดเวลา เช่น 30 นาที หลังจากหมดเวลา ผู้ใช้จะถูกไล่ออกหากไม่มีการดำเนินการใดๆ ข้อดีของวิธีนี้คือหากผู้ใช้ลืมออกจากระบบ จะสามารถป้องกันไม่ให้ผู้อื่นดำเนินการที่เป็นอันตรายได้ ข้อเสียคือหากคุณกำลังทำอะไรบางอย่างที่ใช้เวลานานและเกินเวลาที่กำหนด คุณอาจต้องเข้าสู่ระบบอีกครั้งเมื่อส่ง หากพื้นผิวใบเดิมถูกบังคับให้ล้มเหลวอีกครั้ง คุณอาจสูญเสียงานที่คุณทำไปแล้ว จากมุมมองของการใช้งาน นี่เป็นวิธีที่ง่ายที่สุด และฝั่งเซิร์ฟเวอร์จะใช้โหมดนี้ตามค่าเริ่มต้น
อีกวิธีหนึ่งคือไซต์ใช้โครงสร้างเฟรม และมีเฟรมหรือ iframe ที่ซ่อนอยู่ซึ่งรีเฟรชอยู่ตลอดเวลา เพื่อที่คุณจะไม่ถูกไล่ออก อย่างไรก็ตาม ในการพิจารณาว่าคุณออนไลน์อยู่หรือไม่ เซิร์ฟเวอร์จำเป็นต้องตั้งค่า หากคุณเกินเวลางุนงงนี้ หากคุณไม่รีเฟรชเพจอื่น ยกเว้นเพจที่รีเฟรชอัตโนมัติ จะถือว่าคุณไม่ได้ออนไลน์อีกต่อไป ตัวอย่างทั่วไปของแนวทางนี้คือ xici.net ข้อได้เปรียบของมันคือสามารถใช้การรีเฟรชอย่างต่อเนื่องเพื่อใช้ฟังก์ชันบางอย่างที่คล้ายกับการพุชเซิร์ฟเวอร์ เช่น การส่งข้อความระหว่างชาวเน็ต
ไม่ว่าจะใช้โหมดใดก็ตาม จำเป็นต้องทำงานเพิ่มเติมบางอย่างเพื่อที่จะเรียกดูผู้ใช้ที่ออนไลน์อยู่ทั้งหมดในปัจจุบัน ไม่มี API ที่จะรับรายการเซสชันใน Servlet API
สิ่งที่สามารถใช้ได้คือ Listener ข้อกำหนดของ Servlet 2.2 และ 2.3 แตกต่างกันเล็กน้อยที่นี่ HttpSessionBindingListener ใน 2.2 สามารถใช้คลาสที่แจ้งให้คุณทราบเมื่อแอตทริบิวต์ใน HTTPSession เปลี่ยนแปลง
HttpSessionAttributeListener เปิดตัวใน 2.3 ด้วย เนื่องจากสภาพแวดล้อมที่ฉันใช้คือ Visual age สำหรับ Java 4 และ JRun server 3.1 พวกเขาจึง
ไม่รองรับการเขียนโปรแกรม Servlet 2.3 โดยตรง ที่นี่ฉันใช้ HttpSessionBindingListener
ใช้อินเทอร์เฟซ HttpSessionBindingListener อินเทอร์เฟซนี้มีสองวิธี:
public void valueBound(HttpSessionBindingEvent event)
public void valueUnbound(HttpSessionBindingEvent event)
เมื่อคุณรัน Session.addAttribute(String,Object) หากคุณได้เพิ่มคลาสที่ใช้อินเทอร์เฟซ HttpSessionBindingListener เป็น Attribute เซสชันจะแจ้งให้ทราบ ชั้นเรียนของคุณและเรียกเมธอด valueBound ของคุณ ในทางตรงกันข้าม เมธอด Session.removeAttribute จะสอดคล้องกับเมธอด valueUndound
HttpSessionBinding
คลาสสาธารณะใช้ javax.servlet.http.HttpSessionBindingListener
{
ServletContext application = null;
public HttpSessionBinding(servletContext application)
{
super
()
;
.application = application;
}
public void valueBound(javax.servlet.http.HttpSessionBindingEvent e)
{
เวกเตอร์activeSessions
= (เวกเตอร์
) application.getAttribute("activeSessions")
;
}
JDBCUser sessionUser = (JDBCUser)e.getSession().getAttribute("user");
if (sessionUser != null)
{
activeSessions.add(e.getSession());
}
application.setAttribute("activeSessions",activeSessions) ;
}
public void valueUnbound(javax.servlet.http.HttpSessionBindingEvent e)
{
JDBCUser sessionUser = (JDBCUser)e.getSession().getAttribute("ผู้ใช้");
ถ้า (sessionUser == null)
{
แอปพลิเคชัน Vector activeSessions = (เวกเตอร์)
.getAttribute("activeSessions"
);
if (activeSessions != null)
{
activeSessions.remove(e.getSession().getId());
application.setAttribute
(
"
activeSessions",activeSessions)
;
คลาสเป็นคลาสผู้ใช้ตามอำเภอใจ เมื่อดำเนินการเข้าสู่ระบบของผู้ใช้ ให้เพิ่มทั้งคลาส User และคลาส HttpSessionBinding ให้กับเซสชัน
ด้วยวิธีนี้ ทุกครั้งที่ผู้ใช้เข้าสู่ระบบ บันทึกจะถูกเพิ่มให้กับเวกเตอร์แอตทริบิวต์ "activeSessions" ในแอปพลิเคชัน เมื่อใดก็ตามที่เซสชันหมดเวลา valueUnbound จะถูกทริกเกอร์ และเซสชันที่จะหมดเวลาจะถูกลบออกจากเวกเตอร์นี้
public void login()
จะส่ง ACLException,SQLException,IOException
{
/* get JDBC User Class */
if (user != null )
{
ออกจากระบบ ()
;
}
{
//หาก
เซสชันหมดเวลาหรือผู้ใช้ไม่ได้เข้าสู่ระบบ ให้บันทึก URL เป้าหมายชั่วคราว
=null) ||. (this.request.getParameter("password")==null) )
{
โยน ACLException ใหม่ ("กรุณากรอกชื่อผู้ใช้และรหัสผ่านที่ถูกต้อง");
}
ผู้ใช้ JDBCUser = (JDBCUser) uf.UserLogin(
this .request.getParameter("userID"),
this.request.getParameter("password") );
user.touchLoginTime();
this.session.setAttribute("ผู้ใช้",
this.session.setAttribute("BindingNotify" ,ใหม่ HttpSessionBinding (แอปพลิเคชัน));
}
}
เมื่อเข้าสู่ระบบ ให้เพิ่มคลาสวัตถุประสงค์ผู้ใช้และ BindingNotofy ให้กับเซสชัน เมื่อออกจากระบบ คุณต้องลบเซสชันในเวกเตอร์ activeSessions
สาธารณะ void logout()
พ่น SQLException,ACLException
{
if (this.user == null && this.session.getAttribute("user")==null)
{
return ;
}
เวกเตอร์ activeSessions = (เวกเตอร์) this.application.getAttribute("activeSessions");
if (activeSessions
!= null)
{
activeSessions.remove(this.session);
application.setAttribute("activeSessions",
}
util.Enumeration e = this.session.getAttributeNames();
ในขณะที่ (e.hasMoreElements())
{
String
s = (String)e.nextElement();
this.session.removeAttribute(s)
;
);
this.user = null;
}
ฟังก์ชันทั้งสองนี้อยู่ในคลาส HttpSessionManager คลาสนี้อ้างถึงแอปพลิเคชันโกลบอลอ็อบเจ็กต์ใน jsp โค้ดอื่นของคลาสนี้ไม่เกี่ยวข้องกับบทความนี้และค่อนข้างยาว ดังนั้นฉันจะไม่โพสต์มัน
มาดูวิธีการใช้งานใน JSP กันดีกว่า
สมมติว่าแบบฟอร์มเข้าสู่ระบบถูกส่งไปยัง doLogin.jsp และแบบฟอร์มประกอบด้วยฟิลด์ชื่อผู้ใช้และรหัสผ่าน ข้อความที่ตัดตอนมา:
<%
HttpSessionManager hsm = new HttpSessionManager(application,request,response);
ลอง
{
hsm.login();
}
catch (UserNotFoundException e)
{
response.sendRedirect("InsufficientPrivilege.jsp?detail=User%20does%20not %20exist) ");
return;
}
catch (InvalidPasswordException e2)
{
response.sendRedirect("InsufficientPrivilege.jsp?detail=Invalid%20Password");
return;
}
catch (ข้อยกเว้น e3)
{
% > ข้อผิดพลาด:<%=e3.toString( ) %><br><br>
กด <a href="login.jsp">ที่นี่</a> เพื่อเข้าสู่ระบบใหม่
}
response.sendRedirect
("index.jsp");
มา
ดูกันว่าเรามีอะไรบ้าง มีตอนนี้ วิธีรับรายชื่อผู้ใช้ที่ออนไลน์อยู่ในปัจจุบัน
<body bgcolor="#FFFFFF">
<table cellspacing="0" cellpadding="0" width="100%">
<tr >
<td style="width:24px"">SessionId
</td
"> <td style= "width:80px" ><ผู้ใช้
</td>
<td style="width:80px" ><เวลาเข้าสู่ระบบ
</td>
<td style="width:80px" >เวลาเข้าถึงล่าสุด
</td>
</tr>
<%
vector activeSessions = (Vector) application.getAttribute("activeSessions");
ถ้า (activeSessions == null)
{
activeSessions = new Vector();
application.setAttribute("activeSessions",
}
ตัววนซ้ำ = activeSessions.iterator() ;
while (it.hasNext())
{
HttpSession sess = (HttpSession)it.next();
JDBCUser sessionUser = (JDBCUser)sess.getAttribute("ผู้ใช้");
สตริง userId = (sessionUser!=null)?sessionUser.getUserID ():"ไม่มี";
%>
<tr>
<td nowrap=''><%= sess.getId() %></td>
<td nowrap=''><%= userId %></td><
<td nowrap=''>
<%= BeaconDate.getInstance( new Java.util.Date(sess.getCreationTime())).getDateTimeString()%>
</td"> <td class="<%= stl %><3 " nowrap=''>
< <%= BeaconDate.getInstance( new java.util.Date(sess.getLastAccessedTime())).getDateTimeString()%></td"> </tr>
<
%
}
%>
</table>
</body>
โค้ดด้านบนดึงข้อมูล activeSessions จากแอปพลิเคชันและแสดงเวลาที่กำหนด คลาส BeaconDate จะถือว่าเป็นคลาสเวลาที่จัดรูปแบบแล้ว
ด้วยวิธีนี้เราจะได้กรอบสำหรับการดูรายชื่อผู้ใช้ออนไลน์ สำหรับเพจรายชื่อผู้ใช้ออนไลน์และฟังก์ชันอื่นๆ นั้นไม่เกี่ยวข้องกับบทความนี้และจะไม่กล่าวถึง
นี่คือตัวอย่างของโมเดลที่ไม่รีเฟรชซึ่งอาศัยกลไกการหมดเวลาของเซสชัน sonymusic เพื่อนร่วมงานของฉันชี้ให้เห็นว่าหลายครั้งอาจไม่น่าเชื่อถือเนื่องจากความคิดที่แตกต่างกันของผู้ผลิตแต่ละราย เมื่อพิจารณาข้อกำหนดนี้ มีความจำเป็นต้องพิจารณาว่าเวลานับตั้งแต่การใช้งานครั้งล่าสุดโดยผู้ใช้ปัจจุบันเกินค่าเวลาที่กำหนดไว้ล่วงหน้าหรือไม่ เมื่อรีเฟรชพื้นผิวแต่ละใบ นี่คือการนำการหมดเวลาเซสชันไปใช้ด้วยตนเอง หากคุณต้องการใช้โมเดลการรีเฟรช คุณต้องใช้วิธีการนี้ในการตัดสินการรีเฟรชสำหรับพื้นผิวแต่ละใบ