改變 cgi.rb 對輸出的處理,方便地支援 session, cookie


聲明 : 此文章未經本人同意,請不要轉載 (以下為本人學習成果,不想因小弟不才而誤人子弟丫)

花了 2 小時,粗略看了看 cgi.rb , cgi/session.rb 的代碼,終於得到了一點頭緒,終於免強地支援了 session 的輸出,不用再使用手冊上的那個方法,因為他一定要有 cgi.out 的輸出,而同時在 Block 內一定要有資料,資料長度不能為 “0”, 否則會出錯:

手冊上的 :

1
2
3
4
5
6
7
8
require "cgi"
cookie = CGI::Cookie.new("rubyweb", "CustID=123", "Part=ABC");
cgi = CGI.new("html3")
cgi.out( "cookie" => [cookie] ){
cgi.html{
"\nHTML content here"
}
}

而我的方法只要這樣,必須大於零的條件刪去了,只要用以下的方法就可以

1
2
3
4
5
require "cgi"
cookie = CGI::Cookie.new("rubyweb", "CustID=123", "Part=ABC");
cgi = CGI.new
cgi.out([cookie]) {""}
puts "nHTML content here"

簡化了很多東西,而且將 out 這個方法內處理日文 Charset 資料都刪除,我想效率會好一點,因為都用 utf-8 的 = =

下面是我所測試時寫的代碼 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/InstantRails/ruby/bin/ruby

=begin
*
* Author : Zeuxis Lo
* Date : 2007/07/18
* WebSite: http://skhk.uni.cc/
*
* 未經本人同意,請勿轉載
*
=end

require "cgi"
require "cgi/session"

# 改寫 CGI (cgi.rb) 的輸出方式 (主要是刪去了內容長度計算和日文部份的 Charset 處理)
#
class CGI
def out(options = "text/html")
options = { "type" => options } if options.kind_of?(String)
content = yield

output = stdoutput
output.binmode if defined? output.binmode
output.print header(options)
output.print content unless "HEAD" == env_table['REQUEST_METHOD']
end
end

# 送出 Session 的方法
#
begin
cgi = CGI.new

if cgi['sk'] == 'me'
cgi.out{""}
cookies = cgi.cookies
session = CGI::Session.new( cgi, "session_key" => "rubyweb",
"prefix" => "web-session.")
puts "Me Page"
puts "<hr />"
puts "<b>Session : #{session['CustID']} - #{session['Part']}</b>"
puts "<br />"
puts "<b>Cookies : #{cookies['CustID'][0]} - #{cookies['Part'][0]}</b>"
else
session = CGI::Session.new( cgi, "session_key" => "rubyweb",
"session_id" => "9650",
"new_session" => true,
"prefix" => "web-session.")
cookie1 = CGI::Cookie.new('CustID', '0001E')
cookie2 = CGI::Cookie.new('Part', 'C_user')
cgi.out("cookie" => [cookie1, cookie2]) {""}
session["CustID"] = '0002E'
session["Part"] = "S_User"

puts "<a href='index.rb?sk=me'>link To Self</a> - <a href='page.rb'>Link To Page.rb</a>"
end

rescue => e
cgi.out{""}
p e.message
end

page.rb 的代碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/InstantRails/ruby/bin/ruby

=begin
*
* Author : Zeuxis Lo
* Date : 2007/07/18
* WebSite: http://skhk.uni.cc/
*
* 未經本人同意,請勿轉載
*
=end

require "cgi"
require "cgi/session"

cgi = CGI.new
sess = CGI::Session.new( cgi, "session_key" => "rubyweb",
"prefix" => "web-session.")
cookie = cgi.cookies

begin
puts "Content-type: text/html; charset=utf-8\r\n\r\n"
puts "Session Customer #{sess['CustID']} orders an #{sess['Part']}"
puts "<br />"
puts "Cookies Customer #{cookie['CustID'][0]} orders an #{cookie['Part'][0]}"
rescue
p e.message
end