GVKun编程网logo

PHP-同一会话,不同域,设置会话ID(php不同用户登录不同页面)

17

对于想了解PHP-同一会话,不同域,设置会话ID的读者,本文将是一篇不可错过的文章,我们将详细介绍php不同用户登录不同页面,并且为您提供关于c#–如果在配置中未设置会话提供程序时如何获取会话超时值?

对于想了解PHP-同一会话,不同域,设置会话ID的读者,本文将是一篇不可错过的文章,我们将详细介绍php不同用户登录不同页面,并且为您提供关于c# – 如果在配置中未设置会话提供程序时如何获取会话超时值?、httpservletrequest-创建新会话/更改会话ID、JSP Servlet会话invalidate()不会使会话为空、node.js – 使用快速/连接和会话存储时如何查找会话ID?的有价值信息。

本文目录一览:

PHP-同一会话,不同域,设置会话ID(php不同用户登录不同页面)

PHP-同一会话,不同域,设置会话ID(php不同用户登录不同页面)

我有几个要租用的域名.
我创建了这样的方法:

用户登录在中央位置进行,并且会话保存在数据库中.

假设用户A要转到abc.com域.我的应用将其重定向到他登录的主身份验证域.
登录后生成一个身份验证令牌,该身份验证令牌保存在会话表的字段中,并将其传递回abc.com应用程序.

在这里,我使用auth_token从数据库中获取session_id,并将abc.com的session_id设置为相同.

问题在于它始终会创建一个新会话.

这是我的abc.com代码

$sessionId = // get from the database using the auth_token.
 /* CLOSE PREVIoUS SESSION */
            session_destroy();

// sets the new id.  
            session_id($sessionId);

            /** start new session * */
            session_start();

我缺少什么?
我在Symfony框架中使用PHP.不知道它是否与symfony会话处理有关.

解决方法:

好.我解决了我的问题.
我必须在调用session_destroy()之后删除旧的会话cookie.

如果有人感兴趣,这是我的完整代码:

$sessionId =  // get session id from  the database using the auth_token
session_destroy();

$this->getResponse()->setCookie('mycookie',null,time()-3600);

session_id($sessionId);

/** start new session * */

session_start();

$this->getResponse()->setCookie('mycookie', $sessionId,null,null,'mydomain');

谢谢大家的帮助.

c# – 如果在配置中未设置会话提供程序时如何获取会话超时值?

c# – 如果在配置中未设置会话提供程序时如何获取会话超时值?

我目前正在实现自己的会话提供者,并且想知道如果配置文件中的条目不存在,或者如果我的会话提供者应该从另一个地方获取,会话提供者中是否设置了20分钟的默认值.

解决方法

我在全局配置文件中找不到值,但是它被定义在某处.

使用以下代码可以获取会话超时值,无论是否在本地的web.config中定义.

Configuration conf = WebConfigurationManager.OpenWebConfiguration(System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath);
SessionStateSection section = (SessionStateSection) conf.GetSection("system.web/sessionState");
int timeout = (int) section.Timeout.TotalMinutes;

httpservletrequest-创建新会话/更改会话ID

httpservletrequest-创建新会话/更改会话ID

我正在维护Java Web应用程序。

通过登录代码,它可以通过HttpServletRequest的getSession()方法从HttpServletRequest中获取一个HttpSession。(它在会话中使用一些值进行认证)

但是,我担心会话固定攻击,因此在使用初始会话后,我想开始一个新会话或更改会话ID。这可能吗?

答案1

小编典典

Servlet 3.0 API不允许您更改现有会话上的会话ID。通常,为了防止会话固定,您将只想创建一个新的并使旧的无效。

您可以像这样使会话无效

request.getSession(false).invalidate();

然后创建一个新的会话

getSession(true)(也getSession()应该工作)

显然,如果会话中有要保留的数据,则需要将其从第一个会话复制到第二个会话。

请注意,对于会话固定保护,通常认为只对身份验证请求执行此操作即可。但是更高级别的安全性涉及为每个请求都抛弃旧会话并进行新会话。

JSP Servlet会话invalidate()不会使会话为空

JSP Servlet会话invalidate()不会使会话为空

我的JSP项目中有三个简单的HttpServlet类,即“ LoginServlet”,“ LogoutServlet”和“
ProfileServlet”。

  • LoginServlet:通过将“名称”属性设置为会话来登录用户
  • LogoutServlet:注销用户并使会话无效
  • ProfileServlet:如果用户已登录,则显示用户欢迎信息

我认为以下两个最后两个servlet是有问题的。

@SuppressWarnings("serial")public class LogoutServlet extends HttpServlet {        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {            response.setContentType("text/html");            PrintWriter out=response.getWriter();            HttpSession session=request.getSession(false);            session.invalidate();            request.getRequestDispatcher("link.jsp").include(request, response);            out.print("You are successfully logged out!");            out.close();    }}

@SuppressWarnings("serial")public class ProfileServlet extends HttpServlet {    protected void doGet(HttpServletRequest request,            HttpServletResponse response) throws ServletException, IOException {        response.setContentType("text/html");        PrintWriter out = response.getWriter();        request.getRequestDispatcher("link.jsp").include(request, response);        HttpSession session = request.getSession(false);        if (session != null) {            String name = (String) session.getAttribute("name");            out.print("Hello, " + name + " Welcome to Profile");        } else {            out.print("Please login first");            request.getRequestDispatcher("login.html").include(request,                    response);        }        out.close();    }}

和link.jsp:

<% HttpSession nsession = request.getSession(false);if(nsession == null) {%><a href="login.html">Login</a><%}else {%><a href="LogoutServlet">Logout</a><%}%><a href="ProfileServlet">Profile</a><hr/>

问题是用户登录时,单击“注销”链接并调用“ LogoutServlet”时,会话未正确无效,并且ProfileServlet仍打印出来

"Hello, null Welcome to Profile"

而不是重定向到“ login.html”页面,因为该会话仍不为null。结果,“登录”链接未显示在“ link.jsp”页面上。这使用户无法尝试再次登录。

编辑: 为了使问题得到澄清,我做了一个新的html页面并更新了servlet以执行此操作

request.getRequestDispatcher("link.html").include(request, response);

和“ link.html”。

<a href="login.html">Login</a><a href="LogoutServlet">Logout</a><a href="ProfileServlet">Profile</a><hr/>

有趣的是,这正是我想要的!我想问题是

request.getRequestDispatcher("link.jsp").include(request, response);

但是我无法解释为什么…

答案1

小编典典

在JSP中,默认情况下会创建新会话(如果不存在),因此您将始终获得非null会话。您可以通过在页面上添加以下页面指令来禁用它:

<%@ page session="false" %>

node.js – 使用快速/连接和会话存储时如何查找会话ID?

node.js – 使用快速/连接和会话存储时如何查找会话ID?

如果用户已经登录并尝试在新实例中再次登录,我希望它注销另一个用户实例.我不希望同一个用户在我的应用程序中登录两次.

目前,会议存储在Redis商店中,我正在使用express / connect来处理会话存储.可用于销毁会话的可用功能之一如下:

.destroy(sid,callback)

但是我需要在调用.destroy()之前找到该会话ID.在Redis中,用户名存储为会话的一部分.

问题:是否可以根据用户名查询Redis获取会话ID?

解决方法

req.sessionID将为您提供会话的SID.

关于PHP-同一会话,不同域,设置会话IDphp不同用户登录不同页面的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于c# – 如果在配置中未设置会话提供程序时如何获取会话超时值?、httpservletrequest-创建新会话/更改会话ID、JSP Servlet会话invalidate()不会使会话为空、node.js – 使用快速/连接和会话存储时如何查找会话ID?的相关信息,请在本站寻找。

本文标签: