我正在使用VS2010并创建了一个简单的asp.Web表单应用程序,使用Development Server对其进行测试.
我尝试在会话中存储用户数据 - 从sql server查询 - 因为我不想在每个请求中访问数据库.我正在使用'Application_AuthenticateRequest'和'Session_Start'方法.
第一轮:调用AuthenticateRequest.运行以下代码:
public static void Initialize(string login_name, bool force_refresh)
{
HttpSessionState Session = HttpContext.Current.Session;
object o = Session == null ? null : Session["EMPLOYEE_DATA"];
if (force_refresh || o == null || o.GetType() != typeof(Employee) || (o as Employee).login_name!= login_name)
{
_current = UIManager.GetEmployee(login_name);
if (Session != null)
{
Session["EMPLOYEE_DATA"] = _current;
}
}
else
{
_current = (Employee)o;
}
}
Run Code Online (Sandbox Code Playgroud)
_current变量是通过静态属性发布的私有静态字段.在第一轮中,Session是null,我认为没关系,因为Session_Start尚未调用.Session_Start看起来像这样:
protected void Session_Start(object sender, EventArgs e)
{
Session["EMPLOYEE_DATA"] = EmployeeFactory.Current;
}
Run Code Online (Sandbox Code Playgroud)
在下一轮中,当然没有调用Session_Start,但在AuthenticateRequest中我无法访问会话.HttpContext.Current.Session为null,this.Session引用抛出HttpException,表示"会话状态在此上下文中不可用". …
我正在使用Apache上的PHP开发Web应用程序.$ _SESSION变量对于必须在页面中保持不变的信息使用得相当多.
我们需要每个用户能够打开多个并发会话,作为新选项卡或新窗口,具体取决于他们选择的浏览器.现在,当用户打开添加选项卡或窗口并转到站点时,将采用现有会话.如何防止这种情况,以便用户必须(或可能)登录并启动新会话,而不会干扰他们已经打开的任何现有会话?
我们的临时解决方法是使用多个浏览器(IE和FF),但这显然不是一种非常理想的做事方式.
我想从会话范围中读取域对象(UserVO).
我在名为WelcomeController的控制器中设置UserVO
@Controller
@RequestMapping("/welcome.htm")
public class WelcomeController {
@RequestMapping(method = RequestMethod.POST)
public String processSubmit(BindingResult result, SessionStatus status,HttpSession session){
User user = loginService.loginUser(loginCredentials);
session.setAttribute("user", user);
return "loginSuccess";
}
}
Run Code Online (Sandbox Code Playgroud)
我能够在jsp页面中使用该对象 <h1>${user.userDetails.firstName}</h1>
但是我无法从另一个Controller中读取值,
我正在尝试读取session属性,如下所示:
@Controller
public class InspectionTypeController {
@RequestMapping(value="/addInspectionType.htm", method = RequestMethod.POST )
public String addInspectionType(InspectionType inspectionType, HttpSession session)
{
User user = (User) session.getAttribute("user");
System.out.println("User: "+ user.getUserDetails().getFirstName);
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个单页网站,使用AJAX加载新的PHP文件并更新显示.
我在主页面上启动我的php会话但是当我使用ajax更新内部html时,我需要为正在加载的新php文件使用这些会话变量.
这篇文章与此类似:PHP会话变量未保留.但我检查了我的php.ini有session.use_cookies = 1
主页PHP:
<?php
session_start();
if(isset($_SESSION['views']))
{$_SESSION['views']=$_SESSION['views']+1;}
else
{$_SESSION['views']=1;}
?>
Run Code Online (Sandbox Code Playgroud)
用户输入之后我使用ajax来调用php文件并加载页面的子部分:
<?php
if(isset($_SESSION['views']))
{ echo "Views: " . $_SESSION['views'];}
else
{ echo "Views: NOT SET";}
?>
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我,我错过了哪一个重要的步骤?谢谢.
更新:在对主页和子页面添加session_id()调用后,我看到两个页面都具有相同的Session_ID.但是它仍然无法拉取会话变量,如果我确实为它赋值,则两个相同名称的会话变量保持彼此独立.
回答这个问题创建的问题: 我发现我必须在php.ini文件中设置静态session_save路径.对于大多数付费虚拟主机服务,他们只有一个会话的默认容器,但它受负载平衡的影响.真是个好主意.
以下是我的登录页面的代码,其中登录脚本检查用户的真实性,然后使用标题功能重定向到收件箱页面.
<?php
session_start();
include_once('config.php');
$user=htmlentities(stripslashes($_POST['username']));
$password=htmlentities(stripslashes($_POST['password']));
// Some query processing on database
if(($id_user_fetched<=$id_max_fetched) && ($id_user_fetched!=0)){
$_SESSION['loggedIn'] = 'yes';
header("Location:http://xyz/inbox.php?u=$id_user_fetched");
//echo 'Login Successful';
}else{
echo 'Invalid Login';
echo'<br /> <a href="index.html">Click here to try again</a>';
}
}else{
echo mysqli_error("Login Credentials Incorrect!");
}
?>
Run Code Online (Sandbox Code Playgroud)
inbox.php页面如下所示:
<?php
session_start();
echo 'SESSION ='.$_SESSION['loggedIn'];
if($_SESSION['loggedIn'] != 'yes'){
echo $message = 'you must log in to see this page.';
//header('location:login.php');
}
//REST OF THE CODE
?>
Run Code Online (Sandbox Code Playgroud)
现在使用上面的代码,inbox.php总是显示输出:SESSION =您必须登录才能看到此页面.这意味着没有设置会话变量或者inbox.php无法检索会话变量.我哪里错了?
我有一个带有c#代码的asp.net项目.我有一个名为GlobalVariable的静态类,我存储了一些信息,例如当前选择的产品.
但是,我看到当有两个用户使用该网站时,如果有人更改了所选产品,则会为每个人更改.静态变量似乎与每个人都是共同的.
我想创建(来自c#代码)某种会话变量,它只使用c#代码,但不仅来自页面,而且来自任何类.
对于登录我使用a session_start(),对于桌面它的工作正常,但在移动设备上,它不起作用.session_id()例如,当我使用变量时,session_id('login')它可以在移动设备上运行,但在其他计算机上打破其他会话.但是当session_id()自动生成时,它在移动设备上不起作用.我该怎么办?
我在index.php上的session_start代码
session_start();
if (isset($_SESSION['username'])){
session_id();
}
Run Code Online (Sandbox Code Playgroud)
login.php文件的整个代码
<?php
require('config.php');
$usernameOK = false; $passwordOK = false;
if (isset($_POST['username']) and isset($_POST['password'])){
$username = $_POST['username'];
$password = $_POST['password'];
$UserQuery = "SELECT username FROM `members` WHERE username='$username'";
$userTestResult = mysqli_query($connection, $UserQuery);
$usernameTEST = mysqli_num_rows($userTestResult);
if($usernameTEST == 1){$usernameOK = true;}
$PasswordQuery = "SELECT password FROM `members` WHERE username='$username'";
$result = mysqli_query($connection,$PasswordQuery);
$row = mysqli_fetch_row($result);
if (password_verify($password, $row[0])){$passwordOK = true;}
if($usernameOK == true && $passwordOK == true){ …Run Code Online (Sandbox Code Playgroud) 我在调试这个特殊问题时遇到了一些麻烦,我希望有人知道我做错了什么.
我有一个自定义CMS系统工作,它使用Paragraph作为构建块,使用Ajax(prototypejs)调用和按预定顺序解析HTML块的函数进行更新,清理它们并将这些数据保存在Session变量的关联数组中.用户登录,会话已创建,我可以在我需要的每个页面中检查此会话而不会出现问题.该系统直接在最终网站上运行,因此用户可以实时查看他的更新并按照普通用户的方式浏览网站,但需要进行编辑.所以,这里没什么新鲜的.但这是奇怪的事情.
编辑模式下的最终用户站点(管理员用户已登录):路径"/"
验证记录状态后,函数处理可编辑内容并将关联数组保存到会话中,它还会启动一些javascript对象以编辑每个段落.数据实际上已保存,我可以使用外部脚本检查这个PHP脚本结束后是否存在.如果我加载新页面(新内容),会话更新新数据)
管理员用户使用Inplaceeditor修改段落,此HTML块通过Ajax发送到启动命名会话的php脚本,读取当前会话数据,检查是否应修改,附加或删除段落,并将值重新分配给现有数组键在$_SESSION.如果我在分配新数据之后创建了一个var_dump()o print_r.$_SESSION之后脚本回显处理过的html,ajax更新调用页面上的原始段落.
此脚本位于/admin/cms/...etc中,这意味着站点根目录中至少有4个目录.
当脚本结束时,我检查使用相同的会话转储脚本来查看数据是否真的被写入/提交,但是没有,$_SESSION只有来自调用页面的原始数据.相同的ID,相同的会话名称,相同session_start()但没有数据写入.这整个操作非常快,所以我可能会遇到速度问题,脚本会在session_write_close可以完成之前结束.
但是,如果我向$_SESSION数组添加一个新密钥并在其中放入一些数据,则会更新和写入数据.如果我没有在这个脚本上输出任何内容,只是处理数据和设置会话变量,它也会得到更新和编写.
就像$_SESSION数组的某些成员被阻止更新一样.
我做了什么来跟踪这个错误,我确定我没有做错.
register_globals当然没有了session_name()并且session_start()始终以给定的session_start()在同一页面session_write_close()在会话数据处理后使用.也最奇怪的是,当我只处理没有输出的数据时,$_SESSION可以更新.但是如果我之后通过添加输出并再次尝试来修改此脚本,而不是仅仅显示新的(最后一个)值,我将获得原始值,即在第一个位置由调用页面创建的值,有时在玩了几个之后倍!PHP无法缓存脚本之间的值或?我没有全局化.
我真的很无能为力.这个系统在PHP4.3上运行完美,因为我使用5.3.3两个飞蛾我的用户在哪里调用数据混淆,所以我检查了,是的,有严重的问题.今天我更新到(5.3.6)并且我无法提交此会话值.
通过Ajax调用的脚本代码:
<?
session_cache_limiter('nocache');
session_name("CMS_ses");
session_start();
include('../htmLawed/htmLawed.php');
include("utils_cms.php");
include("../../../php/utils_array.php");
$value=$_POST['value'];
$editorId=$_POST['editorId'];
$clase=$_POST['clase'];
$editorId=str_replace("pre","",$editorId);
$value=html_entity_decode(stripslashes($value),ENT_QUOTES);
if (strlen(trim($value))==0)
{
die();
}
$value="<div id=\"$editorId\" class=\"$clase\">$value</div>";
$newXHTML=$value;
$retorno=CMS_nuevoBloque($newXHTML,$editorId);
$_SESSION['data']['CMSeditores']=$retorno[1];
$_SESSION['data']['CMScont']=$retorno[2];
session_write_close();
print_r($retorno[0]); //Offending …Run Code Online (Sandbox Code Playgroud) 我最近切换了服务器,现在我的主页无法正常工作.它给出了以下文字:
Warning: session_start() [function.session-start]: open(/var/lib/php/session/sess_eqbchncji8kj22f0iqa9g3v7u2, O_RDWR) failed: Permission denied (13) in /var/www/vhosts/alt.alternativedc.com/httpdocs/index.php on line 6
Warning: Unknown: open(/var/lib/php/session/sess_eqbchncji8kj22f0iqa9g3v7u2, O_RDWR) failed: Permission denied (13) in Unknown on line 0
Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php/session) in Unknown on line 0
Run Code Online (Sandbox Code Playgroud)
我认为这意味着会话文件夹不可写,因此我在ssh-ed进入服务器后运行以下命令:
chmod o+rw /var/lib/php/session
Run Code Online (Sandbox Code Playgroud)
这似乎没有解决问题.不知道现在该怎么办......
我在CakePHP中找到的一个很好的功能是能够设置flash消息,比如说某些save脚本,然后在下一页显示该消息.像Post updated,或者Error - no file found.
Cake所做的就是这个session对象.我试图避免像瘟疫这样的会议,因为他们对可扩展性的要求很高.我是否可以简单地将Flash消息存储在cookie(客户端)中,然后在下一页显示后删除该cookie?这种方法的优点/缺点是什么 - 或者更简单地说,为什么Cake使用session(我假设这与_SESSION集合有关).
干杯!
ps在我的实现中,我也使用setTimeoutjavascript中的命令淡出.我发现这是结束整个过程的好方法.