in reply to Passing Sesion ID with CGI::Session

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.

Replies are listed 'Best First'.
Re^2: Passing Sesion ID with CGI::Session
by cees (Curate) on Jun 15, 2005 at 13:54 UTC

    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).