Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在使用之前,如何跟踪每个servlet请求的会话?单身汉不行吗?_Java_Google App Engine_Session_Servlets - Fatal编程技术网

Java 在使用之前,如何跟踪每个servlet请求的会话?单身汉不行吗?

Java 在使用之前,如何跟踪每个servlet请求的会话?单身汉不行吗?,java,google-app-engine,session,servlets,Java,Google App Engine,Session,Servlets,对于我得到的每个servlet请求,在我需要检查会话中的某些内容和HttpSession之前,我可能会传递10个方法 获取HttpSession的唯一方法是从HttpServletRequest,对吗 如何跟踪每个servlet请求的会话?不幸的是,我不能简单地创建一个单例(例如,SessionInformation.instance().getAttribute(“name”)),因为该会话将用于所有请求 是否有一种方法可以全局存储每个请求的会话,而不必将其(或其信息)向下传递到所有方法,以防

对于我得到的每个servlet请求,在我需要检查会话中的某些内容和HttpSession之前,我可能会传递10个方法

获取HttpSession的唯一方法是从HttpServletRequest,对吗

如何跟踪每个servlet请求的会话?不幸的是,我不能简单地创建一个单例(例如,SessionInformation.instance().getAttribute(“name”)),因为该会话将用于所有请求

是否有一种方法可以全局存储每个请求的会话,而不必将其(或其信息)向下传递到所有方法,以防我需要它

更新1:

阿洛奇把我推向了正确的方向。我需要的东西可以是:

1) 管理仅在线程上全局存储变量。“单线程”解决方案

2) 或者servlet获取的每个线程/请求是否都有唯一的id?如果是,什么

我如何跟踪您的会话 每个servlet请求?

服务器通过在浏览器上保存会话ID的cookie对其用户进行标记来识别用户。在服务器上,会话是放置在客户机/服务器交互过程中需要跟踪的数据的位置(为应用程序提供状态)

注意:由于App Engine将会话数据存储在数据存储和memcache中,因此会话中存储的所有值都必须实现java.io.Serializable接口

然后,您可以通过执行以下操作从HttpServletRequest中获取会话

request.getSession()
见javadoc:

在servlet中检索会话后,使用
session.getAttribute(“name”)
检索您感兴趣的任何数据,以跟踪交互

是否有方法全局存储每个请求的会话

当唯一具有访问会话ID的东西是获得该会话ID附带的请求的servlet时,为什么要全局存储它呢

下面是会话ID cookie附带的请求的一个示例:

GET /something.htm HTTP/1.1     
Accept: www/source     
Accept: text/html     
Cookie: sessid=123456789
您不能全局存储此信息,它对于每个请求都是唯一的

无需通过考试

使用数据执行有用的操作时,不要将会话传递给方法,而是传递有用的信息,如用户名、购物车内容等

HttpSession session = request.getSession() //inside a servlet
String userName = session.getAttribute("name");
List<ShoppingItems> items= session.getAttribute("cart");

MakeTheUserPay(userName, items) //no session passing here
HttpSession session=request.getSession()//在servlet中
字符串userName=session.getAttribute(“名称”);
列表项=session.getAttribute(“购物车”);
MakeTheUserPay(userName,items)//此处不传递会话

您的业务逻辑方法甚至不应该知道会话是什么。它更像是一个人工制品。

我认为您需要的是一个变量。

我认为您需要使用a在表示层和业务层之间传递状态(我假设存在一个)


上下文对象使您能够封装状态并跨层传递,而不必担心状态本身是如何维护的。如果您需要获得这方面的更多信息,可以参考《核心J2EE模式》一书中的上下文对象设计模式。

您写道“并非应用程序中的所有内容都需要了解每个请求。”-如果我开始在每个方法中传递数据,就会发生这种情况。我想要的是,每当我需要从会话中获取名称时,都可以使用类似“SessionInformation.instance().getAttribute(“name”)”的东西。我不想阅读并将名称发送到“可能”使用它的每个“页面”。如果我开始在每个方法中传递数据,就会发生这种情况。如果我开始在每个方法中传递数据,就会发生这种情况。“---你不会在不使用它的地方传递它。“我不想阅读并将名称发送到每个“可能”使用它的“页面”-将对象传递给代码中需要它的部分。这样做有什么问题?就我个人而言,我一直在尝试做一些普通的事情。例如,我的站点有“pages”(一个实现接口页面的类),它为我执行的每个页面/请求执行逻辑和呈现。但并不是所有页面都需要存储在会话中的“用户名”,所以为什么调用页面时总是要发送用户名?我更愿意在该特定页面中执行“String username=SessionInformation.instance().getUserName()”,而不是始终将其作为方法参数发送。@bakkal我也想执行相同的操作,您是否找到了此问题的解决方案?这正是我想要的。我需要用谷歌搜索它,看看它到底做了什么:)@corgrath请看这里:说实话。正确的方法是传递信息。您的应用程序不应该太复杂,它必须将该信息发送到10个方法。谢谢大家。
HttpSession session = request.getSession() //inside a servlet
String userName = session.getAttribute("name");
List<ShoppingItems> items= session.getAttribute("cart");

MakeTheUserPay(userName, items) //no session passing here