编辑:(更新)
也许我的问题不够明确.好的,我们这样说吧:
$arr["a"] = 10;
var_dump($arr);
$arr["b"] =& $arr["a"];
var_dump($arr);
Run Code Online (Sandbox Code Playgroud)
第一个var_dump返回:
array
'a' => int 10
Run Code Online (Sandbox Code Playgroud)
而第二个回归:
array
'a' => &int 10
'b' => &int 10
Run Code Online (Sandbox Code Playgroud)
如果我取消设置($ arr ["a"]),它将返回:
array
'b' => int 10
Run Code Online (Sandbox Code Playgroud)
规则是,当2个或更多变量"指向"相同内容时,var_dump将显示带有&符号(&)的引用.
在$ _SESSION的情况下,即使使用 register_long_arrays = Off $ _SESSION仍然显示引用.所以很明显,其他变量也指向相同的内容.
换句话说,如果我取消设置($ _ SESSION),仍然可以链接到某个地方的其他变量.在上面的例子中,当我取消设置($ ARR [ "一"]) :我仍然可以,如果我创建链接,像恢复内容$ ARR [ "z"的] =&$ ARR [ "b"的].
所以,我原来的问题是,有谁知道其他变量是什么?这个变量很可能不存在......但我想知道为什么PHP内部会显示这个变量.
谢谢
(原始问题:)
在PHP中创建会话时,例如:
session_start();
$_SESSION["name"] = "my name";
Run Code Online (Sandbox Code Playgroud)
并转储GLOBAL变量:
var_dump($GLOBALS);
Run Code Online (Sandbox Code Playgroud)
你会看到类似的东西:
'HTTP_SESSION_VARS' => &
array
'name' => …Run Code Online (Sandbox Code Playgroud) 我遇到了类似的问题,并且已经知道我的侦听器类将在读取web.xml时被实例化.我在侦听器类中使用的函数很少,主servlet的doPost(它与数据库(mysql)交互以读取/写入有关用户的数据.)以及HttpSessionListener的方法.那么是什么阻止了容器加载监听器类.我收到404错误.
片段:
public class EntryServlet extends HttpServlet{
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
PlayersList playa = new PlayersList(); //listener class
if(!playa.isExisting(params[3])){
if(params[1].equals("Register")){
playa.addPlayer(params);
}
}
else
out.println("Username already exists");
if(playa.isExisting(params[argUName],params[argUPwd])){
HttpSession session = request.getSession(true);
session.setMaxInactiveInterval(600);
HashMap playersMap = playa.getActivePlayers();
//code . .
}
else
out.println("Couldn't locate player Name!");
out.println(playa.getIn());
}
Run Code Online (Sandbox Code Playgroud)
听众课程:
public class PlayersList implements HttpSessionListener{
private Connection cn;
private Statement st;
PlayersList(){
try{
Class.forName("com.mysql.jdbc.Driver");
cn = DriverManager.getConnection("jdbc:mysql://localhost/homeDbse\'","root","");
st = cn.createStatement();
}
catch(ClassNotFoundException ce){} …Run Code Online (Sandbox Code Playgroud) 我保存到会话的对象是a LocalizationContext,它不可序列化,我的Tomcat是5.5.28,而qa服务器是Tomcat 5.5.30.这是来自Tomcat文档:
每当Catalina正常关闭并重新启动,或者触发应用程序重新加载时,标准的Manager实现将尝试将所有当前活动的会话序列化为通过pathname属性定位的磁盘文件.然后,当应用程序重新加载完成时,所有这些保存的会话将被反序列化并激活(假设它们在平均时间内没有过期).
为了成功恢复会话属性的状态,所有这些属性必须实现java.io.Serializable接口.您可以通过
<distributable>在Web应用程序部署描述符(/WEB-INF/web.xml)中包含该元素,使Manager强制实施此限制 .
这让我觉得它应该打破我的本地,并且你永远不能在Tomcat中保存会话属性,除非它实现Serializable.
编辑:
对不起,为了更清楚,我的问题是双重的.是否所有会话属性都必须是可序列化的,如果这样做,为什么它仍然可以在我的本地环境中工作?
我有一个Java EE应用程序,通过http/s接收请求.请求不包含任何cookie或jsessionid请求参数.
在请求有效负载中,我可以找到一个字符串"sessionid",它应该允许我将该请求与HttpSession相关联.我已经设法实现了一种在内存中存储会话映射的机制,但这在集群环境中不是(容易)可扩展的.
用于将请求关联到HttpSessions的标准Java EE机制基于cookie或URL重写,这对我来说是不可用的,因为我不控制发送请求的第3方.此外,HttpServletRequest对象没有setSession()方法.
有没有直接的方法将请求关联到HttpSession,而不依赖于特定的Java EE服务器或某些分布式缓存?
应用程序服务器如何跟踪哪个客户端与哪个HttpSession对象相关联?它与跟踪客户端之间的TCP/IP连接有关吗?还是饼干?我怀疑它是cookie,因为有一种单独的方法来提取cookie.
背景
我知道servlet和JSP可以调用request.getSession()来获取与客户端关联的HttpSession对象.我很好奇服务器在客户端请求新页面时如何知道返回同一个对象.我一直在搜索,我找到的所有文档都是关于如何提取会话信息的.我对服务器如何从它可以访问的客户端数据海中隔离该会话信息感兴趣.
我的问题是关于Java GAE应用程序(链接)中的HTTP会话.在appengine-web.xml的默认版本中,会话被禁用.此HTML注释位于XML文件的每个起始版本中:
<!--
HTTP Sessions are disabled by default. To enable HTTP sessions specify:
<sessions-enabled>true</sessions-enabled>
It's possible to reduce request latency by configuring your application to
asynchronously write HTTP session data to the datastore:
<async-session-persistence enabled="true" />
With this feature enabled, there is a very small chance your app will see
stale session data. For details, see
http://code.google.com/appengine/docs/java/config/appconfig.html#Enabling_Sessions
-->
Run Code Online (Sandbox Code Playgroud)
我很明白设置<sessions-enabled>为true 的好处:我们可以利用servlet中的HTTP会话.然而,这已经让我不知道为什么会有人永远不希望启用放在首位会议.启用会话的缺点是什么?有什么用例可以让他们禁用?
我不确定这个问题是否与GAE的Python或Go运行时相关,我只了解Java运行时.
下面是在控制器内部编写的JAVA代码.我将购物车对象保存在HttpSession中,以便我可以为同一个会话检索它.有没有办法在C#中做类似的事情?
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("in servlet");
Cart cart = getCartFromSession(request);
}
Cart getCartFromSession(HttpServletRequest req){
HttpSession session = req.getSession(true);
Cart cart=(Cart)session.getAttribute("cart");
if(cart==null){
cart = new Cart();
session.setAttribute("cart", cart);
}
return cart;
}
Run Code Online (Sandbox Code Playgroud) 如果登录 servlet 中的用户名、密码和位置正确,我将创建一个 HttpSession 并进入 jsp 页面。下面是servlet中的代码:
HttpSession sessionsa = request.getSession(true);
sessionsa.setAttribute("user",userName); //userName is a String variable
sessionsa.setAttribute("location",location); //location in value place is a String variable
Run Code Online (Sandbox Code Playgroud)
现在在jsp页面上我无法访问属性。jsp上的代码:
sessionsa = request.getSession();
String user = (String) sessionsa.getAttribute("user");
String location = (String) sessionsa.getAttribute("location");
Run Code Online (Sandbox Code Playgroud)
它指出在类 SimplifiedJSPServlet 中找不到符号变量 sessiona。请帮忙。从 2 天起一直在谷歌上搜索它。
我正在运行Mojarra 2.2.0。
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)
托管bean操作方法是-
public void action() {
HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
.getExternalContext().getSession(false);
System.out.println(session.getId()); // not null for stateful views
}
Run Code Online (Sandbox Code Playgroud)
对于stateless视图session.getId()抛出NPE
对于非无状态视图-触发GET请求,有 JSESSIONID=340041C96D5AA446D761C3602F54A76D
我读了它在这里觉得─
对于客户端状态保存机制,JSF不会创建会话,并且会在必要时将视图状态存储在表单形式为javax.faces.ViewState的隐藏输入字段中。
此外,这里提到
JSF确实会自动创建会话,因为必须将JSF视图状态存储在该位置。如果将JSF状态保存方法设置为客户端而不是服务器,则它将不会存储在会话中,因此无需创建会话
我认为以上内容为我带来麻烦。
如果将JSF状态保存方法设置为客户端而不是服务器,那么它将不会存储在会话中//完全同意
和
因此无需创建会话。//这很混乱,因为对于客户端保存机制,会话ID由Servlet容器生成,因此存在与请求相关联的会话。
参考与BalusC在这个问题上的讨论,我创建了一个HttpSessionListener-
@WebListener
public class MyHttpSessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
Thread.dumpStack();
}
public void sessionDestroyed(HttpSessionEvent event) {
}
}
Run Code Online (Sandbox Code Playgroud)
请参阅以下附件的屏幕截图(这2个屏幕截图适用于2.0.3版,必须存在一个旧的bug才能创建会话)-
request.getSession().getId()和之间有什么区别request.getRequestedSessionId()?他们两个都返回相同的东西,即会话ID吗?
谢谢
我已将ArrayList保存到会话对象.我正在尝试使用它来检索它
sriList = session.getAttribute("scannedMatches");
Run Code Online (Sandbox Code Playgroud)
我得到编译时错误"无法从Object转换为ArrayList".如何从会话对象中恢复我的ArrayList.
如何在Rest Web服务中使用HttpSession保存到登录用户名?以及如何将会话传递给另一个Web服务类或其他类?
谢谢