Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much

Passing Sesion ID with CGI::Session

by tanger (Scribe)
on Jun 15, 2005 at 05:20 UTC ( #466792=perlquestion: print w/replies, xml ) Need Help??

tanger has asked for the wisdom of the Perl Monks concerning the following question:

Hey All,

I decided to try CGI::Session out and was wondering if the user does not have cookies enabled, then that means I would need to pass the session id through the query string?

I'm assuming HTML::Template would be best for this? Are there any other options that may be better/ more efficient?

ty tanger!

Replies are listed 'Best First'.
Re: Passing Sesion ID with CGI::Session
by PodMaster (Abbot) on Jun 15, 2005 at 07:11 UTC
Re: Passing Sesion ID with CGI::Session
by b10m (Vicar) on Jun 15, 2005 at 12:23 UTC

    I've ran into this problem recently too. Sometimes forcing users to accept cookies is not an option. You might want to skip on cookies alltogether, or use both (cookies and query_string options). I chose for the last (for I hate links/URIs that contain session IDs).

    First I see wheter the user accepts cookies or not. The basic idea of how to do that can be found at merlyn's WebTechniques pages.

    If the user does not accept cookies, you store that information in the session (no_cookies = true, or -might be nicer-, cookies = false). That way, you can tell your template to throw in the session id. It's a hellish task to change all URLs this way, but at least Template Toolkit gives you the power to add macros. I've used something like this:

    [% MACRO gen_link BLOCK %] <a href="/[% m %]/[% p | uri | html %][% IF no_cookies %]/[% sid %][% +END %]">[% t %]</a> [% END %]

    (I use CGI::Application and have a little URI Parser set up to strip the session id from the path info)

    Then I call that macro like this

    # m = CGI::Application "module" # p = the "page" in question # t = the linked "text" [% gen_link(m="shop", p="band/$item.bandname", t="$item.bandname") %]

    There are probably better ways to tackle all of this (you might be interested in Template::Plugin::URL), but at least it "works" for me ;)


    All code is usually tested, but rarely trusted.

      I use Template Toolkit with CGI::Application as well, and I have found the URL plugin very useful for keeping my URLs consistent.

      I have a default template that is automatically loaded by the PRE_PROCESS option in Template Toolkit which contains the following:

      [% USE url( query.url( '-absolute'=1 ) module=current_module rm=curren +t_rm ) %]

      Here 'query' is just a object, and I pass values for current_module and current_rm to the templates in my code. This primes the URL plugin with a valid URL for the current page and runmode.

      Then in my templates I use something like this for all my URLs:

      [% # use current script and runmode url(); # use current script with new runmode and params url( rm='other_runmode' param='value' param2=tplvar ); # link to a new script completely url( '/index.cgi' rm='other_runmode' param='value' param2=tplvar ); %]

      Of course you could add the session stuff in to the 'USE url' statement so that by default the session is added to every generated URL automatically.

      [% USE url( query.url( '-absolute'=1 ) module=current_module rm=curren +t_rm ) %]

      By the way, that 'module' parameter is there because I use CGI::Application::Dispatch. I modified the URL plugin to automatically generate proper URLs using PATH_INFO that coresponds with CGI::Application::Dispatch. If anyone uses that same combination, let me know and I'll provide the changes (they were quite trivial).

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://466792]
Approved by Tanalis
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (4)
As of 2023-03-25 08:32 GMT
Find Nodes?
    Voting Booth?
    Which type of climate do you prefer to live in?

    Results (62 votes). Check out past polls.