我使用数据库支持的会话进行Code Igniter项目。 Web应用程序受密码保护,这意味着我有一个抽象控制器,在我允许他查看任何页面之前检查用户是否已登录,除了登录表单。
虽然我没有遇到任何问题,但我很难理解如何让用户将用户重定向到他想要查看的页面,如果他需要先登录。
如何:用户注销并输入URL。应用程序检测到他没有登录,因此将他发送到登录页面并在ci_session表中创建一行。同时,我使用flashdata或userdata存储用户在会话对象中输入的url。我的问题是,一旦用户登录,应用程序将在数据库中创建一个新行,这意味着一个新的会话,完全忽略我之前存储的值。
每个会话不应该是一行吗?
答案 0 :(得分:2)
CI URL Helper具有您可以使用的重定向功能。 http://codeigniter.com/user_guide/helpers/url_helper.html
是否指定了本地URI的“标头重定向”。就像此帮助程序中的其他功能一样,此功能旨在重定向到您站点中的本地URL。您不会指定完整的站点URL,而只需指定要指向的控制器的URI段。该函数将根据您的配置文件值构建URL。
可选的第二个参数允许您在“位置”方法(默认)或“刷新”方法之间进行选择。位置更快,但在Windows服务器上,它有时可能是一个问题。可选的第三个参数允许您发送特定的HTTP响应代码 - 例如,这可用于为搜索引擎目的创建301重定向。默认响应代码为302.第三个参数仅适用于“位置”重定向,而不是“刷新”。例子:
if ($logged_in == FALSE)
{
redirect('/login/form/', 'refresh');
}
// with 301 redirect
redirect('/article/13', 'location', 301);
答案 1 :(得分:2)
我认为您误解了会话在浏览器和Web应用程序之间的工作方式。当用户打开您的登录页面时,会为他们分配一个唯一的会话ID,codeigniter会跟踪该ID。除非您的会话过期,无论是通过注销还是由于您自己的会话过期设置,codeigniter应该只在您的数据库中为每个唯一会话写入1行。确保将config.php中的sess_expiration变量设置为真实的。
我不知道如何从你的cookie名称中删除下划线可以解决这个问题,因为该名称与会话的工作方式无关。
答案 2 :(得分:0)
你可以使用这样的东西。
当用户尝试访问类似
的页面时http://test.com/userpage.php
如果他没有登录,请将他重定向到
http://test.com/login.php?redirectpage=userpage.php
(在从cookie或会话中检查登录状态后,此重定向将由userpage.php完成。)
登录页面的值为“redirectpage”,一旦用户登录登录页面,将其重定向到他之前尝试访问的页面。
您必须在用户登录所需的所有页面中检查用户登录状态。
答案 3 :(得分:0)
解决了它。
我的问题不是如何重定向或如何存储数据。我的问题是应用程序为每个请求创建两个会话。
我将我的cookie名称更改为不包含下划线和固定的内容。每个请求一个会话,一切正常。