JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Servlet/JSP 討論區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 [JSP/Servlet入門]session 隱含物件(2) [精華]
caterpillar

良葛格

版主

發文: 2613
積分: 70
於 2004-05-25 20:17 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
session(HttpSession)物件會在使用者第一次存取Web伺服器時產生,伺服器會產生一個獨特的session id來表示這個客戶端,瀏覽器在之後的每次請求中都包括這個session id(可能是使用Cookie或是URL rewriting,這個細節不用您來擔心),伺服器根據這個session id來對應該客戶端的session物件,您可以使用getId()方法來取得session id,例如:
1
2
3
<%
    out.println("Session ID:" + session.getId());
%>


顯示的session id型式如下:
1
Session ID:2F892EDF2669858811B8D121119AE90B


session id預設是使用Cookie來儲存於客戶端,並在每一次瀏覽器發送請求時夾帶這個訊息給伺服器,伺服器根據session id來對應出HttpSession物件,假如Cookie沒有開啟,則瀏覽器將無法儲存session id,也就無法將session id的訊息傳送給伺服器,也就無法進行進程追蹤,即使資料物件確實儲存於HttpSession中,我們也無法取出,下面這個程式在瀏覽器Cookie功能關閉的情況下,只會一直顯示session not found, reset!訊息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@page contentType="text/html;charset=Big5"%>
<html>
<head><title>session demo</title></head>
<body>
<H1>
    <%
        if(session.getAttribute("info") == null) {
            session.setAttribute("info", "session information");
            out.println("session not found, reset!");
        }
        else
            out.println("session found: " + session.getAttribute("info"));
    %>
</H1>
</body>
</html>


如果Cookie功能關閉,則session id無法儲存,也就無法在下一次請求時一併送至伺服器,為了讓進程追蹤得以進行,我們必須進行URL rewriting來傳送session id,所幸的是有一個簡單的方法可以幫您進行這個動作,使用response的encodeURL()可以自動將session id編進URL中,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@page contentType="text/html;charset=Big5"%>
<html>
<head><title>session demo</title></head>
<body>
<H1>
    <%
        if(session.getAttribute("info") == null) {
            session.setAttribute("info", "session information");
            out.println("session not found, reset!");
        }
        else
            out.println("session found: " + session.getAttribute("info"));
        out.println("<br><a href='" + response.encodeURL("sessiondemo.jsp") + "'>" + "進程追蹤" + "</a>");
    %>
</H1>
</body>
</html>


如果您的瀏覽器Cookie功能關閉,您必須使用response的encodeURL()自動將session id編進URL中,如果Cookie功能可以運作,則encodeURL()會原封不動的傳回指定的URL,否則會在指定的URL後加上sessiond id,例如上面的JSP網頁在Cookie功能關閉的情況下,會傳回以下的內容:
1
2
3
4
5
6
7
8
9
10
<html>
<head><title>session demo</title></head>
<body>
<H1>
    session not found, reset!
<br><a href='sessiondemo.jsp;jsessionid=7A2A0BFA32D0022D8BB80A5E690A9D10'>進程追蹤</a>
 
</H1>
</body>
</html>


簡單的說,按下經過URL rewriting的連結,瀏覽器就可以將session id傳送至伺服器,然而您的網址列上就會出現session id的訊息:
1
http://localhost:8080/myjsp/sessiondemo.jsp;jsessionid=7A2A0BFA32D0022D8BB80A5E690A9D10


這是一個有危險性的訊息,任何人只要在session的存活期限獲得這個訊息,就可以進行進程追蹤,所以基本上還是建議使用者開啟Cookie功能,以免session id曝露在網址列上。

我們上一個主題的登入網頁如果在Cookie功能關閉的情況下也將無法運作,我們必須這樣改寫login.jsp:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%@page contentType="text.html;charset=Big5"%>
<%
    String user = request.getParameter("user");
    String password = request.getParameter("password");
    String memberURL = "http://localhost:8080/myjsp/member.jsp";
    String loginFormURL = "http://localhost:8080/myjsp/form.html";
 
    if(user == null || password == null) {
        response.setHeader("Refresh", "0; " + loginFormURL);
    }
    else if(user.equals("justin") && password.equals("1234")) {
        session.setAttribute("user", user);
        memberURL = response.encodeURL(memberURL);
        response.setHeader("Refresh", "3; " + memberURL);
        out.println(user + "歡迎登入!3秒後進入會員頁面!");
    }
    else {
        response.setHeader("Refresh", "3; " + loginFormURL);
        out.println("使用者或密碼錯誤,請重新登入(3秒後回到登入表單)");
    }
%>


或者是您可以直接使用response的sendRedirect()方法,由於sendRedirect()要求完整的位址訊息,也就是包括http://開始的位址訊息,您可以使用response的encodeRedirectURL()傳回這個位址,同樣的,如果Cookie有開啟,則只是原封不動傳回原來指定的URL,我們也可以改寫login.jsp程式如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%@page contentType="text.html;charset=Big5"%>
<%
    String user = request.getParameter("user");
    String password = request.getParameter("password");
    String memberURL = "http://localhost:8080/myjsp/member.jsp";
    String loginFormURL = "http://localhost:8080/myjsp/form.html";
 
    if(user == null || password == null) {
        response.setHeader("Refresh", "0; " + loginFormURL);
    }
    else if(user.equals("justin") && password.equals("1234")) {
        session.setAttribute("user", user);
        memberURL = response.encodeRedirectURL(memberURL);
        response.sendRedirect(memberURL);
    }
    else {
        response.setHeader("Refresh", "3; " + loginFormURL);
        out.println("使用者或密碼錯誤,請重新登入(3秒後回到登入表單)");
    }
%>


session具有其存活期限,關閉瀏覽器、伺服器關閉可能讓session失效,當客戶端停止活動一段時間(Tomcat預設是30分鐘),session會自動失效,您可以使用getMaxInactiveInterval()取得session的等待期限,取得的值以秒為單位,或是以setMaxInactiveInterval()設定等待期限,設定的值也是以秒為單位:
1
2
3
4
5
<%
    out.println("default session life: " + session.getMaxInactiveInterval());
    session.setMaxInactiveInterval(600);
    out.println("now session life: " + session.getMaxInactiveInterval());
%>


您可以在web.xml中設定預設的session等待期限,使用<session-config>與<session-timeout>來進行設定,注意設定的單位為分鐘數,例如下面的設定將session等待期限預設為10分鐘:
1
2
3
4
5
    <session-config>
        <session-timeout>
            10 <!--分鐘-->
        </session-timeout>
    </session-config>


caterpillar edited on 2004-05-26 09:58
reply to postreply to post
良葛格學習筆記
作者 Re:[JSP/Servlet入門]session 隱含物件(1) [Re:caterpillar]
rebecca0429





發文: 3
積分: 0
於 2006-11-03 13:31 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list


reply to postreply to post
作者 Re:[JSP/Servlet入門]session 隱含物件(2) [Re:caterpillar]
cameloo





發文: 7
積分: 0
於 2006-11-13 23:49 user profilesend a private message to usersend email to camelooreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
真的很感激,謝謝版主,我是剛學JSP

reply to postreply to post
太陽出來了 ^_*
作者 session 隱含物件(2) [Re:caterpillar]
abc19711davidlu





發文: 1
積分: 0
於 2007-01-09 21:44 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Dear 版主:

我直接用URLrewriting()-->response.encodeURL()希望用session_id 去區別 UserName當IEBrowser 重開卻得不到相同的sessionID而且我試過的Cookie的中與低是相同的狀況可以給我解答或是其他的解決方案嗎?以下是原始碼

<%@ page contentType="text/html;charset=utf-8" import="java.util.*,java.sql.*" %>
<%
out.println("SessioinID"+session.getId());
String SessioinID=session.getId();
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/northwind?user=root&password=mysql");
Statement smt = con.createStatement();
String sql;
sql = "SELECT session_id,CompanyName from session_data where session_id='"+SessioinID+"'";

ResultSet rs = smt.executeQuery(sql);

if (rs.next()) {
String CompanyName = rs.getString("UserName");
String SessioindbID= rs.getString("session_id");
session.setAttribute("UserName",UserName);
out.println("UserName:"+UserName);
out.println("session_id:"+SessioindbID);
response.encodeURL("firlogin.jsp");
}
else {
session.setAttribute("UserName","temp");
out.println("UserName:temp");
response.encodeURL("firlogin.jsp");
}
con.close();
smt.close();
rs.close();

%>

firstlogin.jsp (0.95k)


reply to postreply to post
作者 Re:[JSP/Servlet入門]session 隱含物件(2) [Re:caterpillar]
jjsnake





發文: 10
積分: 0
於 2007-12-21 11:41 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
很不错!
入过能在 加一些 方法介绍就更好了


reply to postreply to post
» JWorld@TW »  Servlet/JSP 討論區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8