buildrelease
[openafs-wiki.git] / TWiki / CGISessionDotPm.mdwn
1 # <a name="Package &lt;code&gt;="></a> Package =
2
3 **extends** `CGI::Session::ErrorHandler `
4
5 <div>
6   <ul>
7     <li><a href="#Package =="> Package ==</a></li>
8   </ul>
9 </div>
10
11 =head1 NAME
12
13 CGI::Session - persistent session data in CGI applications
14
15 =head1 SYNOPSIS
16
17 # Object initialization: use CGI::Session; $session = new CGI::Session();
18
19 $CGISESSID = $session-&gt;id();
20
21 # send proper HTTP header with cookies: print $session-&gt;header();
22
23 # storing data in the session $session-&gt;param('f\_name', 'Sherzod'); # or $session-&gt;param(-name=&gt;'l\_name', -value=&gt;'Ruzmetov');
24
25 # flush the data from memory to the storage driver at least before your # program finishes since auto-flushing can be unreliable $session-&gt;flush();
26
27 # retrieving data my $f\_name = $session-&gt;param('f\_name'); # or my $l\_name = $session-&gt;param(-name=&gt;'l\_name');
28
29 # clearing a certain session parameter $session-&gt;clear(["l\_name", "f\_name"]);
30
31 # expire '\_is\_logged\_in' flag after 10 idle minutes: $session-&gt;expire('is\_logged\_in', '+10m')
32
33 # expire the session itself after 1 idle hour $session-&gt;expire('+1h');
34
35 # delete the session for good $session-&gt;delete();
36
37 =head1 DESCRIPTION
38
39 CGI-Session is a Perl5 library that provides an easy, reliable and modular session management system across HTTP requests. Persistency is a key feature for such applications as shopping carts, login/authentication routines, and application that need to carry data across HTTP requests. CGI::Session does that and many more.
40
41 =head1 TRANSLATIONS
42
43 This document is also available in Japanese.
44
45 =over 4
46
47 =item o
48
49 Translation based on 4.14: <http://digit.que.ne.jp/work/index.cgi?Perldoc/ja>
50
51 =item o
52
53 Translation based on 3.11, including Cookbook and Tutorial: <http://perldoc.jp/docs/modules/CGI-Session-3.11/>
54
55 =back
56
57 =head1 TO LEARN MORE
58
59 Current manual is optimized to be used as a quick reference. To learn more both about the philosophy and CGI::Session programming style, consider the following:
60
61 =over 4
62
63 =item \*
64
65 L&lt;CGI::Session::Tutorial|CGI::Session::Tutorial&gt; - extended CGI::Session manual. Also includes library architecture and driver specifications.
66
67 =item \*
68
69 We also provide mailing lists for CGI::Session users. To subscribe to the list or browse the archives visit <https://lists.sourceforge.net/lists/listinfo/cgi-session-user>
70
71 =item \*
72
73 B - "HTTP State Management Mechanism" found at <ftp://ftp.isi.edu/in-notes/rfc2965.txt>
74
75 =item \*
76
77 L&lt;CGI|CGI&gt; - standard CGI library
78
79 =item \*
80
81 L&lt;Apache::Session|Apache::Session&gt; - another fine alternative to CGI::Session.
82
83 =back
84
85 =head1 METHODS
86
87 Following is the overview of all the available methods accessible via CGI::Session object.
88
89 =head2 new()
90
91 =head2 new( $sid )
92
93 =head2 new( $query )
94
95 =head2 new( $dsn, $query||$sid )
96
97 =head2 new( $dsn, $query||$sid, \\%dsn\_args )
98
99 Constructor. Returns new session object, or undef on failure. Error message is accessible through L&lt;errstr() - class method|CGI::Session::ErrorHandler/errstr&gt;. If called on an already initialized session will re-initialize the session based on already configured object. This is only useful after a call to L&lt;load()|/"load"&gt;.
100
101 Can accept up to three arguments, $dsn - Data Source Name, $query||$sid - query object OR a string representing session id, and finally, \\%dsn\_args, arguments used by $dsn components.
102
103 If called without any arguments, $dsn defaults to I&lt;driver:file;serializer:default;id:md5&gt;, $query||$sid defaults to C&lt;&lt; CGI-&gt;new() &gt;&gt;, and C&lt;\\%dsn\_args&gt; defaults to I.
104
105 If called with a single argument, it will be treated either as C&lt;$query&gt; object, or C&lt;$sid&gt;, depending on its type. If argument is a string , C&lt;new()&gt; will treat it as session id and will attempt to retrieve the session from data store. If it fails, will create a new session id, which will be accessible through L&lt;id() method|/"id"&gt;. If argument is an object, L&lt;cookie()|CGI/cookie&gt; and L&lt;param()|CGI/param&gt; methods will be called on that object to recover a potential C&lt;$sid&gt; and retrieve it from data store. If it fails, C&lt;new()&gt; will create a new session id, which will be accessible through L&lt;id() method|/"id"&gt;. C&lt;name()&gt; will define the name of the query parameter and/or cookie name to be requested, defaults to I.
106
107 If called with two arguments first will be treated as $dsn, and second will be treated as $query or $sid or undef, depending on its type. Some examples of this syntax are:
108
109 $s = CGI::Session-&gt;new("driver:mysql", undef); $s = CGI::Session-&gt;new("driver:sqlite", $sid); $s = CGI::Session-&gt;new("driver:db\_file", $query); $s = CGI::Session-&gt;new("serializer:storable;id:incr", $sid); # etc...
110
111 Following data source components are supported:
112
113 =over 4
114
115 =item \*
116
117 B - CGI::Session driver. Available drivers are L&lt;file|CGI::Session::Driver::file&gt;, L&lt;db\_file|CGI::Session::Driver::db\_file&gt;, L&lt;mysql|CGI::Session::Driver::mysql&gt; and L&lt;sqlite|CGI::Session::Driver::sqlite&gt;. Third party drivers are welcome. For driver specs consider L&lt;CGI::Session::Driver|CGI::Session::Driver&gt;
118
119 =item \*
120
121 B - serializer to be used to encode the data structure before saving in the disk. Available serializers are L&lt;storable|CGI::Session::Serialize::storable&gt;, L&lt;freezethaw|CGI::Session::Serialize::freezethaw&gt; and L&lt;default|CGI::Session::Serialize::default&gt;. Default serializer will use L&lt;Data::Dumper|Data::Dumper&gt;.
122
123 =item \*
124
125 B - ID generator to use when new session is to be created. Available ID generator is L&lt;md5|CGI::Session::ID::md5&gt;
126
127 =back
128
129 For example, to get CGI::Session store its data using DB\_File and serialize data using [[FreezeThaw]]:
130
131 $s = new CGI::Session("driver:DB\_File;serializer:FreezeThaw", undef);
132
133 If called with three arguments, first two will be treated as in the previous example, and third argument will be C&lt;\\%dsn\_args&gt;, which will be passed to C&lt;$dsn&gt; components (namely, driver, serializer and id generators) for initialization purposes. Since all the $dsn components must initialize to some default value, this third argument should not be required for most drivers to operate properly.
134
135 undef is acceptable as a valid placeholder to any of the above arguments, which will force default behavior.
136
137 =head2 load()
138
139 =head2 load($query||$sid)
140
141 =head2 load($dsn, $query||$sid)
142
143 =head2 load($dsn, $query, \\%dsn\_args);
144
145 Accepts the same arguments as new(), and also returns a new session object, or undef on failure. The difference is, L&lt;new()|/"new"&gt; can create new session if it detects expired and non-existing sessions, but C&lt;load()&gt; does not.
146
147 C&lt;load()&gt; is useful to detect expired or non-existing sessions without forcing the library to create new sessions. So now you can do something like this:
148
149 $s = CGI::Session-&gt;load() or die CGI::Session-&gt;errstr(); if ( $s-&gt;is\_expired ) \{ print $s-&gt;header(), $cgi-&gt;start\_html(), $cgi-&gt;p("Your session timed out! Refresh the screen to start new session!") $cgi-&gt;end\_html(); exit(0); \}
150
151 if ( $s-&gt;is\_empty ) \{ $s = $s-&gt;new() or die $s-&gt;errstr; \}
152
153 Notice, all I sessions are empty, but not all I sessions are expired!
154
155 =head2 id()
156
157 Returns effective ID for a session. Since effective ID and claimed ID can differ, valid session id should always be retrieved using this method.
158
159 =head2 param($name)
160
161 =head2 param(-name=E$name)
162
163 Used in either of the above syntax returns a session parameter set to $name or undef if it doesn't exist. If it's called on a deleted method param() will issue a warning but return value is not defined.
164
165 =head2 param($name, $value)
166
167 =head2 param(-name=E$name, -value=E$value)
168
169 Used in either of the above syntax assigns a new value to $name parameter, which can later be retrieved with previously introduced param() syntax. C&lt;$value&gt; may be a scalar, arrayref or hashref.
170
171 Attempts to set parameter names that start with I will trigger a warning and undef will be returned.
172
173 =head2 param\_hashref()
174
175 B. Use L&lt;dataref()|/"dataref"&gt; instead.
176
177 =head2 dataref()
178
179 Returns reference to session's data table:
180
181 $params = $s-&gt;dataref(); $sid = $params-&gt;\{\_SESSION\_ID\}; $name= $params-&gt;\{name\}; # etc...
182
183 Useful for having all session data in a hashref, but too risky to update.
184
185 =head2 save\_param()
186
187 =head2 save\_param($query)
188
189 =head2 save\_param($query, \\@list)
190
191 Saves query parameters to session object. In other words, it's the same as calling L&lt;param($name, $value)|/"param"&gt; for every single query parameter returned by C&lt;&lt; $query-&gt;param() &gt;&gt;. The first argument, if present, should be either CGI object or any object which can provide param() method. If it's undef, defaults to the return value of L&lt;query()|/"query"&gt;, which returns C&lt;&lt; CGI-&gt;new &gt;&gt;. If second argument is present and is a reference to an array, only those query parameters found in the array will be stored in the session. undef is a valid placeholder for any argument to force default behavior.
192
193 =head2 load\_param()
194
195 =head2 load\_param($query)
196
197 =head2 load\_param($query, \\@list)
198
199 Loads session parameters into a query object. The first argument, if present, should be query object, or any other object which can provide param() method. If second argument is present and is a reference to an array, only parameters found in that array will be loaded to the query object.
200
201 =head2 clear()
202
203 =head2 clear('field')
204
205 =head2 clear(\\@list)
206
207 Clears parameters from the session object.
208
209 With no parameters, all fields are cleared. If passed a single parameter or a reference to an array, only the named parameters are cleared.
210
211 =head2 flush()
212
213 Synchronizes data in memory with the copy serialized by the driver. Call flush() if you need to access the session from outside the current session object. You should at least call flush() before your program exits.
214
215 As a last resort, CGI::Session will automatically call flush for you just before the program terminates or session object goes out of scope. This automatic behavior was the recommended behavior until the 4.x series. Automatic flushing has since proven to be unreliable, and in some cases is now required in places that worked with 3.x. For further details see:
216
217 <http://rt.cpan.org/Ticket/Display.html?id=17541> <http://rt.cpan.org/Ticket/Display.html?id=17299>
218
219 =head2 atime()
220
221 Read-only method. Returns the last access time of the session in seconds from epoch. This time is used internally while auto-expiring sessions and/or session parameters.
222
223 =head2 ctime()
224
225 Read-only method. Returns the time when the session was first created in seconds from epoch.
226
227 =head2 expire()
228
229 =head2 expire($time)
230
231 =head2 expire($param, $time)
232
233 Sets expiration interval relative to L&lt;atime()|/"atime"&gt;.
234
235 If used with no arguments, returns the expiration interval if it was ever set. If no expiration was ever set, returns undef. For backwards compatibility, a method named C&lt;etime()&gt; does the same thing.
236
237 Second form sets an expiration time. This value is checked when previously stored session is asked to be retrieved, and if its expiration interval has passed, it will be expunged from the disk immediately. Passing 0 cancels expiration.
238
239 By using the third syntax you can set the expiration interval for a particular session parameter, say I&lt;~logged-in&gt;. This would cause the library call clear() on the parameter when its time is up. Note it only makes sense to set this value to something I than when the whole session expires. Passing 0 cancels expiration.
240
241 All the time values should be given in the form of seconds. Following keywords are also supported for your convenience:
242
243 +-----------+---------------+
244
245 <table border="1" cellpadding="0" cellspacing="0">
246   <tr>
247     <td align="center"> alias </td>
248     <td align="center"> meaning </td>
249   </tr>
250 </table>
251
252 +-----------+---------------+
253
254 <table border="1" cellpadding="0" cellspacing="0">
255   <tr>
256     <td align="center"> s </td>
257     <td align="center"> Second </td>
258   </tr>
259   <tr>
260     <td align="center"> m </td>
261     <td align="center"> Minute </td>
262   </tr>
263   <tr>
264     <td align="center"> h </td>
265     <td align="center"> Hour </td>
266   </tr>
267   <tr>
268     <td align="center"> d </td>
269     <td align="center"> Day </td>
270   </tr>
271   <tr>
272     <td align="center"> w </td>
273     <td align="center"> Week </td>
274   </tr>
275   <tr>
276     <td align="center"> M </td>
277     <td align="center"> Month </td>
278   </tr>
279   <tr>
280     <td align="center"> y </td>
281     <td align="center"> Year </td>
282   </tr>
283 </table>
284
285 +-----------+---------------+
286
287 Examples:
288
289 $session-&gt;expire("2h"); # expires in two hours $session-&gt;expire(0); # cancel expiration $session-&gt;expire("~logged-in", "10m"); # expires '~logged-in' parameter after 10 idle minutes
290
291 Note: all the expiration times are relative to session's last access time, not to its creation time. To expire a session immediately, call L&lt;delete()|/"delete"&gt;. To expire a specific session parameter immediately, call L&lt;clear([$name])|/"clear"&gt;.
292
293 =head2 is\_new()
294
295 Returns true only for a brand new session.
296
297 =head2 is\_expired()
298
299 Tests whether session initialized using L&lt;load()|/"load"&gt; is to be expired. This method works only on sessions initialized with load():
300
301 $s = CGI::Session-&gt;load() or die CGI::Session-&gt;errstr; if ( $s-&gt;is\_expired ) \{ die "Your session expired. Please refresh"; \} if ( $s-&gt;is\_empty ) \{ $s = $s-&gt;new() or die $s-&gt;errstr; \}
302
303 =head2 is\_empty()
304
305 Returns true for sessions that are empty. It's preferred way of testing whether requested session was loaded successfully or not:
306
307 $s = CGI::Session-&gt;load($sid); if ( $s-&gt;is\_empty ) \{ $s = $s-&gt;new(); \}
308
309 Actually, the above code is nothing but waste. The same effect could've been achieved by saying:
310
311 $s = CGI::Session-&gt;new( $sid );
312
313 L&lt;is\_empty()|/"is\_empty"&gt; is useful only if you wanted to catch requests for expired sessions, and create new session afterwards. See L&lt;is\_expired()|/"is\_expired"&gt; for an example.
314
315 =head2 delete()
316
317 Deletes a session from the data store and empties session data from memory, completely, so subsequent read/write requests on the same object will fail. Technically speaking, it will only set object's status to I and will trigger L&lt;flush()|/"flush"&gt;, and flush() will do the actual removal.
318
319 =head2 find( \\&amp;code )
320
321 =head2 find( $dsn, \\&amp;code )
322
323 =head2 find( $dsn, \\&amp;code, \\%dsn\_args )
324
325 Experimental feature. Executes \\&amp;code for every session object stored in disk, passing initialized CGI::Session object as the first argument of \\&amp;code. Useful for housekeeping purposes, such as for removing expired sessions. Following line, for instance, will remove sessions already expired, but are still in disk:
326
327 The following line, for instance, will remove sessions already expired, but which are still on disk:
328
329 CGI::Session-&gt;find( sub \{\} );
330
331 Notice, above \\&amp;code didn't have to do anything, because load(), which is called to initialize sessions inside find(), will automatically remove expired sessions. Following example will remove all the objects that are 10+ days old:
332
333 CGI::Session-&gt;find( \\&amp;purge ); sub purge \{ my ($session) = @\_; next if $session-&gt;is\_empty; # &lt;-- already expired?! if ( ($session-&gt;ctime + 3600\*240) &lt;= time() ) \{ $session-&gt;delete() or warn "couldn't remove " . $session-&gt;id . ": " . $session-&gt;errstr; \} \}
334
335 B: find will not change the modification or access times on the sessions it returns.
336
337 Explanation of the 3 parameters to C&lt;find()&gt;:
338
339 =over 4
340
341 =item $dsn
342
343 This is the DSN (Data Source Name) used by CGI::Session to control what type of sessions you previously created and what type of sessions you now wish method C&lt;find()&gt; to pass to your callback.
344
345 The default value is defined above, in the docs for method C&lt;new()&gt;, and is 'driver:file;serializer:default;id:md5'.
346
347 Do not confuse this DSN with the DSN arguments mentioned just below, under \\%dsn\_args.
348
349 =item \\&amp;code
350
351 This is the callback provided by you (i.e. the caller of method C&lt;find()&gt;) which is called by CGI::Session once for each session found by method C&lt;find()&gt; which matches the given $dsn.
352
353 There is no default value for this coderef.
354
355 When your callback is actually called, the only parameter is a session. If you want to call a subroutine you already have with more parameters, you can achieve this by creating an anonymous subroutine that calls your subroutine with the parameters you want. For example:
356
357 CGI::Session-&gt;find($dsn, sub \{ my\_subroutine( @\_, 'param 1', 'param 2' ) \} ); CGI::Session-&gt;find($dsn, sub \{ $coderef-&gt;( @\_, $extra\_arg ) \} );
358
359 Or if you wish, you can define a sub generator as such:
360
361 sub coderef\_with\_args \{ my ( $coderef, @params ) = @\_; return sub \{ $coderef-&gt;( @\_, @params ) \}; \}
362
363 CGI::Session-&gt;find($dsn, coderef\_with\_args( $coderef, 'param 1', 'param 2' ) );
364
365 =item \\%dsn\_args
366
367 If your $dsn uses file-based storage, then this hashref might contain keys such as:
368
369 \{ Directory =&gt; Value 1, [[NoFlock]] =&gt; Value 2, UMask =&gt; Value 3 \}
370
371 If your $dsn uses db-based storage, then this hashref contains (up to) 3 keys, and looks like:
372
373 \{ [[DataSource]] =&gt; Value 1, User =&gt; Value 2, Password =&gt; Value 3 \}
374
375 These 3 form the DSN, username and password used by DBI to control access to your database server, and hence are only relevant when using db-based sessions.
376
377 The default value of this hashref is undef.
378
379 =back
380
381 B&lt;Note:&gt; find() is meant to be convenient, not necessarily efficient. It's best suited in cron scripts.
382
383 =head1 MISCELLANEOUS METHODS
384
385 =head2 remote\_addr()
386
387 Returns the remote address of the user who created the session for the first time. Returns undef if variable REMOTE\_ADDR wasn't present in the environment when the session was created.
388
389 =head2 errstr()
390
391 Class method. Returns last error message from the library.
392
393 =head2 dump()
394
395 Returns a dump of the session object. Useful for debugging purposes only.
396
397 =head2 header()
398
399 Replacement for L&lt;CGI.pm|CGI&gt;'s header() method. Without this method, you usually need to create a CGI::Cookie object and send it as part of the HTTP header:
400
401 $cookie = CGI::Cookie-&gt;new(-name=&gt;$session-&gt;name, -value=&gt;$session-&gt;id); print $cgi-&gt;header(-cookie=&gt;$cookie);
402
403 You can minimize the above into:
404
405 print $session-&gt;header();
406
407 It will retrieve the name of the session cookie from C&lt;$session-&gt;name()&gt; which defaults to C&lt;$CGI::Session::NAME&gt;. If you want to use a different name for your session cookie, do something like following before creating session object:
408
409 CGI::Session-&gt;name("MY\_SID"); $session = new CGI::Session(undef, $cgi, \\%attrs);
410
411 Now, $session-&gt;header() uses "MY\_SID" as a name for the session cookie.
412
413 =head2 query()
414
415 Returns query object associated with current session object. Default query object class is L&lt;CGI.pm|CGI&gt;.
416
417 =head2 DEPRECATED METHODS
418
419 These methods exist solely for for compatibility with CGI::Session 3.x.
420
421 =head3 close()
422
423 Closes the session. Using flush() is recommended instead, since that's exactly what a call to close() does now.
424
425 =head1 DISTRIBUTION
426
427 CGI::Session consists of several components such as L&lt;drivers|"DRIVERS"&gt;, L&lt;serializers|"SERIALIZERS"&gt; and L. This section lists what is available.
428
429 =head2 DRIVERS
430
431 Following drivers are included in the standard distribution:
432
433 =over 4
434
435 =item \*
436
437 L&lt;file|CGI::Session::Driver::file&gt; - default driver for storing session data in plain files. Full name: B&lt;CGI::Session::Driver::file&gt;
438
439 =item \*
440
441 L&lt;db\_file|CGI::Session::Driver::db\_file&gt; - for storing session data in [[BerkelyDB]]. Requires: L. Full name: B&lt;CGI::Session::Driver::db\_file&gt;
442
443 =item \*
444
445 L&lt;mysql|CGI::Session::Driver::mysql&gt; - for storing session data in [[MySQL]] tables. Requires L&lt;DBI|DBI&gt; and L&lt;DBD::mysql|DBD::mysql&gt;. Full name: B&lt;CGI::Session::Driver::mysql&gt;
446
447 =item \*
448
449 L&lt;sqlite|CGI::Session::Driver::sqlite&gt; - for storing session data in SQLite. Requires L&lt;DBI|DBI&gt; and L&lt;DBD::SQLite|DBD::SQLite&gt;. Full name: B&lt;CGI::Session::Driver::sqlite&gt;
450
451 =back
452
453 =head2 SERIALIZERS
454
455 =over 4
456
457 =item \*
458
459 L&lt;default|CGI::Session::Serialize::default&gt; - default data serializer. Uses standard L&lt;Data::Dumper|Data::Dumper&gt;. Full name: B&lt;CGI::Session::Serialize::default&gt;.
460
461 =item \*
462
463 L&lt;storable|CGI::Session::Serialize::storable&gt; - serializes data using L. Requires L. Full name: B&lt;CGI::Session::Serialize::storable&gt;.
464
465 =item \*
466
467 L&lt;freezethaw|CGI::Session::Serialize::freezethaw&gt; - serializes data using L. Requires L. Full name: B&lt;CGI::Session::Serialize::freezethaw&gt;
468
469 =item \*
470
471 L&lt;yaml|CGI::Session::Serialize::yaml&gt; - serializes data using YAML. Requires L or L&lt;YAML::Syck&gt;. Full name: B&lt;CGI::Session::Serialize::yaml&gt;
472
473 =item \*
474
475 L&lt;json|CGI::Session::Serialize::json&gt; - serializes data using JSON. Requires L&lt;JSON::Syck&gt;. Full name: B&lt;CGI::Session::Serialize::json&gt;
476
477 =back
478
479 =head2 ID GENERATORS
480
481 Following ID generators are available:
482
483 =over 4
484
485 =item \*
486
487 L&lt;md5|CGI::Session::ID::md5&gt; - generates 32 character long hexadecimal string. Requires L&lt;Digest::MD5|Digest::MD5&gt;. Full name: B&lt;CGI::Session::ID::md5&gt;.
488
489 =item \*
490
491 L&lt;incr|CGI::Session::ID::incr&gt; - generates incremental session ids.
492
493 =item \*
494
495 L&lt;static|CGI::Session::ID::static&gt; - generates static session ids. B&lt;CGI::Session::ID::static&gt;
496
497 =back
498
499 =head1 CREDITS
500
501 CGI::Session evolved to what it is today with the help of following developers. The list doesn't follow any strict order, but somewhat chronological. Specifics can be found in F file
502
503 =over 4
504
505 =item Andy Lester
506
507 =item Brian King Emrbbking@mac.comE
508
509 =item Olivier Dragon Edragon@shadnet.shad.caE
510
511 =item Adam Jacob Eadam@sysadminsith.orgE
512
513 =item Igor Plisco Eigor@plisco.ruE
514
515 =item Mark Stosberg
516
517 =item Matt [[LeBlanc]] Emleblanc@cpan.orgE
518
519 =item Shawn Sorichetti
520
521 =back
522
523 =head1 COPYRIGHT
524
525 Copyright (C) 2001-2005 Sherzod Ruzmetov Esherzodr@cpan.orgE. All rights reserved. This library is free software. You can modify and or distribute it under the same terms as Perl itself.
526
527 =head1 PUBLIC CODE REPOSITORY
528
529 You can see what the developers have been up to since the last release by checking out the code repository. You can browse the Subversion repository from here:
530
531 <http://svn.cromedome.net/>
532
533 Or check it directly with C from here:
534
535 svn://svn.cromedome.net/CGI-Session
536
537 =head1 SUPPORT
538
539 If you need help using CGI::Session consider the mailing list. You can ask the list by sending your questions to <cgi-session-user@lists.sourceforge.net> .
540
541 You can subscribe to the mailing list at <https://lists.sourceforge.net/lists/listinfo/cgi-session-user> .
542
543 Bug reports can be submitted at <http://rt.cpan.org/NoAuth/ReportBug.html?Queue=CGI-Session>
544
545 =head1 AUTHOR
546
547 Sherzod Ruzmetov Esherzodr@cpan.orgE, <http://author.handalak.com/>
548
549 Mark Stosberg became a co-maintainer during the development of 4.0. C&lt;markstos@cpan.org&gt;.
550
551 =head1 SEE ALSO
552
553 =over 4
554
555 =item \*
556
557 L&lt;CGI::Session::Tutorial|CGI::Session::Tutorial&gt; - extended CGI::Session manual
558
559 =item \*
560
561 B - "HTTP State Management Mechanism" found at <ftp://ftp.isi.edu/in-notes/rfc2965.txt>
562
563 =item \*
564
565 L&lt;CGI|CGI&gt; - standard CGI library
566
567 =item \*
568
569 L&lt;Apache::Session|Apache::Session&gt; - another fine alternative to CGI::Session
570
571 =back