使用" InProc "存储的.NET的HttpSessionState似乎将会话变量键值视为不区分大小写.例如:
session["foo"] = 1;
session["Foo"] = 2;
Trace.Write(session["foo"].ToString()); // => 2
Run Code Online (Sandbox Code Playgroud)
这种行为似乎没有记录,所以我想知道它是否仅仅是底层会话存储机制的副作用,还是故意由类本身实现的.由于C#将其他所有内容视为区分大小写,因此会话以不同的方式行事会有点令人不安.是什么赋予了?商店类型有所不同吗?是否与VB向后兼容?
有人能告诉我为什么会话变量不在页面之间传递?他们在2天前工作.现在不是吗?有一个第三方系统根据第三方系统记录用户.我将用户定向到返回网址的登录页面.第三方系统将用户登录并传递其ID和在其末尾生成的令牌,并将其返回到我的站点,其中包含ID和URL中的令牌.
如果未设置会话,我会尝试从网址中获取ID和令牌并设置会话.(工作)我然后生成我自己的令牌来验证从第三方系统(工作)传递的令牌,当我去点击另一页时,我设置的会话不为空(????)
这是我的代码:
<?php
session_start();
// FUNCTION TO PASS THE URL THE USER IS ON SO THEY COME
// BACk TO THIS PAGE AFTER THE LOG IN. IF APPLICABLE
function curPageURL() {
$pageURL = 'http';
if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
$pageURL .= "://";
if ($_SERVER["SERVER_PORT"] != "80") {
$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
} else {
$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
return $pageURL;
}
// DESTROY SESSION INFO IF TIMED OUT
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
session_destroy(); …Run Code Online (Sandbox Code Playgroud) 搜索了StackOverflow和谷歌我认为我正在做的事情是正确的,但结果似乎并不顺利
[TestMethod]
public void LoginAction_Should_Return_View_and_User_Authenticated()
{
// Arrange
var mock = new Mock<ControllerContext>();
var mockSession = new Mock<HttpSessionStateBase>();
mock.Setup(p => p.HttpContext.Session).Returns(mockSession.Object);
var testData = FakeUserData.CreateTestUsers();
var repository = new FakeUserRepository(testData);
var controller = new AccountController(repository);
controller.ControllerContext = mock.Object;
// Act
var result = controller.Login("testuser1", "testuser1");
// Assert
Assert.AreEqual("testuser1", controller.HttpContext.Session["Username"]);
Assert.IsTrue((bool)controller.HttpContext.Session["IsAuthenticated"]);
Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult));
}
Run Code Online (Sandbox Code Playgroud)
当我运行测试时,controller.HttpContext.Session ["Username"]的值为null,但是我使用Session帮助器将值设置为用户名.我做错了什么,还是其他什么?任何帮助将不胜感激.
我试图了解Spring MVC的架构.但是,我完全被@SessionAttributes的行为搞糊涂了.
请看下面的SampleController,它是由SuperForm类处理post方法.事实上,只是SuperForm类的字段只能像我预期的那样绑定.
但是,在我将@SessionAttributes放入Controller后,处理方法作为SubAForm进行绑定.任何人都可以解释我在这个绑定中发生了什么.
-------------------------------------------------------
@Controller
@SessionAttributes("form")
@RequestMapping(value = "/sample")
public class SampleController {
@RequestMapping(method = RequestMethod.GET)
public String getCreateForm(Model model) {
model.addAttribute("form", new SubAForm());
return "sample/input";
}
@RequestMapping(method = RequestMethod.POST)
public String register(@ModelAttribute("form") SuperForm form, Model model) {
return "sample/input";
}
}
-------------------------------------------------------
public class SuperForm {
private Long superId;
public Long getSuperId() {
return superId;
}
public void setSuperId(Long superId) {
this.superId = superId;
}
}
-------------------------------------------------------
public class SubAForm extends SuperForm {
private Long subAId;
public Long …Run Code Online (Sandbox Code Playgroud) 硬盘,主内存或其他地方.我不是要求将这些存储在数据库中的情况.
所有教程都说要开始会话.他们没有说这应该是在网站上的所有页面,还是一些,或者只有1.
如果它只有1页,它必须是主页吗?或者我正在制作表单的页面将会话ID放在数据库中?如果访问者从不访问具有会话ID的页面但他们在网站上,他们是否还有会话ID?
这是我们过去几周一直面临的问题.
1 /我们的设置
2 /问题
我们的第一个应用程序出现问题.
我们的一些用户报告说他们有时会在几分钟后断开连接(当会话设置为持续3小时时).它可能会在同一天发生几次,然后几天没有断开,但问题总是会回来.到目前为止受影响的用户比例很小,但我希望在它"传播"给其他用户之前解决这个问题.
问题似乎发生在应用程序的不同位置,尽管我们已经确定了大多数错误发生的3个scenarii:
我们试图重现用户描述的不同场景:有时我们已经能够,但大多数时候我们没有任何问题,这使得调试变得困难.
其他说明:
3 /技术分析
发生断开连接时,用户将被重定向到"您的会话已过期或您无权查看"页面.加载此页面后,我们会收到一封带有$ _SESSION变量转储的技术电子邮件.
当会话以正常方式到期时,我们收到的电子邮件显示$ _SESSION变量为空(正常行为).当发生意外断开时,有趣的是$ _SESSION并非完全为空:在数组包含的~20个元素中,只剩下一个(总是相同的).
因此,这意味着会话未过期,但没有足够的数据来"识别"用户,因此显示"无权限"页面.作为确认,当发生这种情况时,我们可以检查memcached,该会话仍然保存一些数据.
这些是我们到目前为止已经确定的潜在问题,以及我们为排除它们所做的工作:
所以我们不知道是什么导致了这个问题,因为它似乎是随机发生的,所以我的问题是:
谢谢你的帮助.
我想用这种方式使用laravel在会话中设置一个变量
Session::set('variableName')=$value;
Run Code Online (Sandbox Code Playgroud)
但问题是我不知道在哪里放这个代码,因为我想设置它一次(当客人访问主页或任何其他页面时)?主要的想法是使用全局变量在所有应用程序控制器中使用它,我听到了与配置变量相关的东西,但我不确定使用配置变量或仅使用会话是否是一个好主意?谢谢
php session-variables application-variables laravel laravel-routing
我遇到了Django Request.Session,我知道如何设置和测试它的特定值.
request.session['name'] = "dummy"
Run Code Online (Sandbox Code Playgroud)
我检查的某个地方
if request.session['name'] == "dummy" :
#do something
Run Code Online (Sandbox Code Playgroud)
但是,现在我必须首先检查会话变量是否设置了?我是说如何检查是否存在价值Request.Session['name'] Is set?
请任何人都可以打电话给我,有办法检查吗?
先感谢您.
在每个站点上,web.config包含StateServer和相同的machineKey:
<sessionState mode="StateServer" stateConnectionString="tcpip=STATESRV01:42424" />
<machineKey decryptionKey="EDCDA6DF458176504BBCC720B4E29348E252E652591179E2" validationKey="CC482ED6B5D3569819B3C8F07AC3FA855B2FED7F0130F55D8405597C796457A2F5162D35C69B61F257DB5EFE6BC4F6CEBDD23A4112C4519F55185CB5EB3DFE61"/>
Run Code Online (Sandbox Code Playgroud)
我们还有一个PostRequestHandlerExecute事件处理程序来修改"NET_SessionId"cookie以具有相同的根域和路径.
cookie.Domain = ".mysite.local";
cookie.Path = "/";
Run Code Online (Sandbox Code Playgroud)
在global.asax文件中,我们有以下代码来修改Application_Start事件中的App Name:
protected void Application_Start(object sender, EventArgs e)
{
string applicationName = "mysiteapp";
// Change the Application Name in runtime.
FieldInfo runtimeInfo = typeof(HttpRuntime).GetField("_theRuntime",
BindingFlags.Static | BindingFlags.NonPublic);
HttpRuntime theRuntime = (HttpRuntime)runtimeInfo.GetValue(null);
FieldInfo appNameInfo = typeof(HttpRuntime).GetField("_appDomainAppId",
BindingFlags.Instance | BindingFlags.NonPublic);
appNameInfo.SetValue(theRuntime, applicationName);
}
Run Code Online (Sandbox Code Playgroud)
两个站点都返回相同的会话ID,但是当我们尝试在site1上设置会话值时,site2不会返回值.
站点1(site1.mysite.local)结果
Session ID (Session.SessionID): a55jnfcscxd3f0hnwoik02pp
Session Value: True
Run Code Online (Sandbox Code Playgroud)
站点2(site2.mysite.local)结果
Session ID (Session.SessionID): a55jnfcscxd3f0hnwoik02pp …Run Code Online (Sandbox Code Playgroud) php ×4
asp.net ×2
session ×2
.net ×1
asp.net-mvc ×1
c# ×1
django ×1
iis ×1
laravel ×1
moq ×1
mysql ×1
spring ×1
spring-mvc ×1
unit-testing ×1