我有一个登录页面,可在成功登录后设置会话变量。然后,登录页面重定向到管理页面。管理员页面能够读取会话变量。但是,当我执行一个在内容div中加载viewUsers.php的jQuery load()函数时,会话变量就消失了。奇怪的是,会话ID是相同的。
我在管理页面和viewUsers页面上都使用了var_dump()。管理页面显示了登录页面上的所有适当变量,但使用jQuery load()函数var_dump $ _SESSION调用的viewUsers页面为空白。$ _COOKIE ['PHPSESSID']的var_dump具有正确的ID,对我来说没有任何意义。
这就是我设置会话变量的方式。
$_SESSION['userID'] = $userInfo['ID'];
$_SESSION['userType'] = $userInfo['userType'];
$_SESSION['programID'] = $userInfo['programID'];
Run Code Online (Sandbox Code Playgroud)
这是jQuery
$("#content").load("viewUsers.php");
Run Code Online (Sandbox Code Playgroud)
所有页面的最顶部都有session_start()。当我尝试使用window.open和window.location而不是jQuery load()函数时,会话变量也不起作用。
即使我具有正确的会话ID,一些会话变量也会丢失。如果有人能对此有所启示,我将不胜感激!
截至目前,我正在填充隐藏字段,并使用post函数而不是load来解决它。我知道这不是最好的方法,但是这是我找出方法的唯一方法。
编辑: 这是读取会话变量正常的索引的顶部。
<?php
session_start();
//require("session.php");
if(!isset($_SESSION['userID'])){
header("location: ../login/index.php");
}
?>
Run Code Online (Sandbox Code Playgroud)
这是整个查看用户
<?php
session_start();
//foreach($_POST as $name => $value){
//$_SESSION[$name] = $value;
//}
//echo " session id " . $_COOKIE['PHPSESSID'];
var_dump($_COOKIE);
var_dump($_SESSION);
?>
<?php require("adminFunctions.php"); ?>
<h2>View Current Users</h2>
<?php require("userlinks.php"); ?>
<table id="userTable" class="tablesorter">
<?php getUsers($_SESSION['programID'], $_SESSION['userType']) ?>
</table>
<script type="text/javascript">
$('td[name="userID"]').hide();
//$("#userTable th").click(function(){
//color();
//colorTable(); …Run Code Online (Sandbox Code Playgroud) 我有id一个项目和id一个客户端,它们是以 JSON 格式传递的 php 会话。这些存储在全局变量中id_p,id_c因此我可以使用这些 id 进行多次插入和更新选择等。
当用户选择另一个项目或更改页面时,我需要取消设置这些变量。
null值传递php给全局变量以重置它们吗?php值php?进行查询的文件位于单独的文件中。我一直在努力维护两个子域之间的会话变量,并发现它是不可能的.我最终创建了2个最小的PHP网页作为测试床,我称之为"测试1"
$_SESSION['test'] = "Fred";
Run Code Online (Sandbox Code Playgroud)
并且有一个指向'test 2'的超链接,它只是试图回显$ _SESSION ['test']的值,以证明它是否有效.我在我的www域中放置'test 1',在我的子域中放置'test 2'.我从各种来源尝试各种版本的标题.这是主要的3(当然还有他们的变种):
ini_set('session.cookie_domain',substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100));
session_start();
Run Code Online (Sandbox Code Playgroud)
要么
ini_set('session.cookie_domain','mydomain.com');
session_start();
Run Code Online (Sandbox Code Playgroud)
要么
ini_set('session.cookie_domain', PHP_INI_ALL);
session_start();
Run Code Online (Sandbox Code Playgroud)
要么
session_set_cookie_params(0, "/", ".mydomain.com", false);
session_start();
Run Code Online (Sandbox Code Playgroud)
我发现在每种情况下我都得到相同的结果.会话不在子域中进行,页面测试2不知道我将$ _SESSION ['test']设置为什么值.然而,上述方法之一应该起作用的网络似乎有很多确定性.知道会发生什么,特别是因为我使用最小的页面来测试机制(没有我能看到的副作用)?顺便说一句,我在共享服务器上,如果这是相关的.
谢谢你的想法.坦率.
编辑. 我修好了它.这个问题是由Suhosin引起的.请参阅本页脚底的详细答案.
我有一个网页,登录后,您基本上坐在一个页面上并执行一些导致 AJAX 请求的事情。
由于 AJAX 请求与普通 HTTP 请求没有什么不同,因此它们会根据需要在到达服务器时延长会话的到期时间。
我对此没有任何问题,因为用户的会话只有在与服务器交互时才应该被扩展,这是有道理的。
由于用户基本上停留在这个页面上,我希望能够在他们的会话过期时通知他们,而不是他们在超时发生后尝试使用任何操作访问服务器时发现困难的方法。
所以我被要求实现一些我经常在银行网站上看到的东西,在alert用户会话到期之前,弹出窗口 ( ) 出现。我不需要它在之前立即出现,但是“只要”它到期(或尽可能接近,在它发生之后),因此用户无法在页面上执行任何操作并意外地被重定向到登录页面。
我最初的想法是轮询服务器并每 30 秒左右检查一次。这样做的问题是 AJAX 请求会重置会话的到期时间(即 30 分钟),从而使使用此轮询的点无效。
当然,一个“解决方案”是在 Javascript 中处理这个问题——当收到正常动作的 AJAX 请求时,重置计时器。此计时器将在设置后 30 分钟运行。而且我知道这不会太难,因为我可以将它附加到 jQuery 的全局 AJAX 处理程序,以便它在每次成功的 AJAX 调用后重置计时器,但对我来说跟踪会话时间似乎不正确两个地方出。我宁愿“浪费”资源并经常进行 AJAX 调用。我只是不希望用户必须做一些事情来找出他们的会话何时到期 - 如果他们离开计算机 31 分钟,我希望在他们回来时有一条消息说他们的会话已过期,他们会被重定向。
从我浏览过的许多文章/解释中,我真的找不到任何适用于我的情况的内容。我见过使用 Spring Security 的东西,但不幸的是我们没有使用它,因为我们不使用普通的用户名/密码方案,并且无法弄清楚如何自定义它才能工作。
我已经看到了“过滤器”或“拦截”这些术语,但我不确定我是否可以使用它们,因为这似乎是一个安全问题。
所以基本上,我正在寻找某种方法来在会话过期时进行 HTTP 请求检查,而无需重置其过期时间。我基本上只需要基于此(我可以弄清楚)以某种形式的真/假做出回应。
我真的很想在服务器上保留这种处理,并允许轮询在会话超时时捕获,因此 HTTP 请求需要能够查看会话的当前状态并进行分析,但不能重置超时。
如果有帮助,我的会话声明如下:
@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserDataSession {
Run Code Online (Sandbox Code Playgroud)
我的控制器像这样使用它:
@Autowired
private UserDataSession userDataSession;
Run Code Online (Sandbox Code Playgroud)
有没有办法绕过请求映射中会话到期的重置?
如有问题.是否可以在localStorage中的asp.net页面中设置变量并在另一页面上检索它?
如何在asp.net中设置localStorage变量.可能吗?之后我可以使用以下方法读取变量:
localStorage.getItem('UserID');
Run Code Online (Sandbox Code Playgroud) 我使用Azure PAAS为我的一个客户制作了一个产品版本– Azure Web App(以前称为Azure网站)。我们在自动缩放模式下用最少2个实例标记了该站点。我们开始收到用户的抱怨,他们断断续续地遇到一些问题,只有当他们在积极使用网站时丢失会话变量时,这些问题才会引起。
我们想知道怎么回事,因为我们将会话保持在“过程中”。我们没有在第1天就单独使用proc会话管理器(基于Redis缓存/基于数据库),因为根据该文档,Azure Web应用程序默认情况下使用粘性会话负载平衡器运行(当运行多个实例时) 。它将ARR亲和力Cookie注入Http响应中,这有助于将用户重定向到与第一次建立会话的实例相同。
要调试此问题,我们开始在页面中打印实际的sessionId。经过多次尝试,我们重现了该问题–令人惊讶的是,会议被交换了。可以说–我的会话ID是“ 1eocgtmwwwwvs1cxksyofne4”,在页面刷新后,它更改为“ 5p1hsxszq2mcqmt5i5ytqg12”,包括所有在会话变量中管理的信息。吓人...不是吗?
伸出援手以提供紧急票证–响应是:
“ Azure Web Apps是一个无状态平台,我们的建议是实施一个最适合您的环境的会话管理解决方案,并避免依赖于内存中会话状态管理,尤其是在您的Web App托管在多个服务器上的情况下。如果您正在考虑在不久的将来实现用于会话管理的缓存解决方案,我们建议您暂时移至单个实例,作为一种解决方法,我们将协助您确保应用程序在单个实例上能够按预期工作。 ”
我完全理解这一点-但是为什么Affinity Cookie会失败。我知道可以禁用Affinity cookie,但我没有将其禁用。我想分享这个故事。对于任何其他基于基于Affinity cookie的粘性负载均衡器的人来说,它可能都是有用的。
顺便说一句:Redis会话提供程序的实现非常容易。只需几分钟即可实现。
现在进行验尸-出了什么问题?我不认为Cookie是“不支持”的浏览器。那为什么即使在我支持cookie的浏览器中它也会间歇性地失败。PAAS资源不断移动/交换....我们无法在proc会话中使用…等等
我如何要求 rspec 在下一个请求中使用/保持上一个请求所用的会话。
如果我在第一次获取后打印会话,它与我在处理 blah2_path 的操作中看到的会话不同。
get blah_path, {}, headers
get blah2_path, {}, headers # use same session as blah2_path
Run Code Online (Sandbox Code Playgroud) 我正在使用Spring Boot 1.3.3来构建 Web 应用程序。我使用Redis来处理会话。
我会将一些“关键”数据设置到 中HttpSession,我想了解这将如何与 Redis 配合使用。是服务器端存储的信息加上浏览器端的密钥还是所有数据都在用户浏览器的cookie中?
我想查看答案的文档参考或获得权威答案(例如 Pivotal dev)。
我正在为 Happstack 服务器制作一个会话系统,并使用 mongoDB 进行持久存储。我想知道 MongoDB ObjectID 用作会话 ID 是否安全。
环境: Express、express-session、Stripe
在下面的简化示例中,当用户请求主页时,express-session会为用户分配一个会话 cookie。刷新页面会保留与访问成功或失败路由相同的会话 ID。单击升级按钮会将客户端带到 Stripe 购物车屏幕,该屏幕也保留相同的会话 ID。然而,一旦用户进入 Stripe 购物车并成功购买,他就会被转发到成功路线,并且会话 ID 会被 Stripe 覆盖。在完整版本中,这是一个问题,因为用户将登录,这会导致用户在成功购买后自动注销。我不确定为什么会发生这种情况或如何阻止它。
应用程序.js
const bodyParser = require('body-parser');
require('dotenv').config();
const express = require('express');
const session = require('express-session');
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
const app = express();
app.set('view engine', 'ejs');
app.use(express.static('views'));
app.use(
session({
maxAge: 24 * 60 * 60 * 1000,
name: 'randomName',
resave: false,
saveUninitialized: true,
secret: 'randomSecret',
cookie: {
sameSite: true,
secure: false
}
})
);
app.get('/', function(req, res) {
req.session.userValues = true;
console.log(req.session);
res.render('index', { stripePublicKey: …Run Code Online (Sandbox Code Playgroud) session-variables session-cookies node.js stripe-payments express-session
php ×3
jquery ×2
asp.net ×1
c# ×1
javascript ×1
mongodb ×1
node.js ×1
redis ×1
rspec ×1
rspec-rails ×1
session ×1
sessionid ×1
spring ×1
spring-boot ×1
spring-mvc ×1
subdomain ×1
unset ×1