Session Salesforce会话变量,在会话中设置和获取变量

Session Salesforce会话变量,在会话中设置和获取变量,session,salesforce,visualforce,apex-code,force.com,Session,Salesforce,Visualforce,Apex Code,Force.com,我希望能够在Salesforce网站页面中读/写一些变量到当前会话 我有一个使用Salesforce站点构建的站点,我需要在所有页面中存储/检索一些值(假设我正在构建类似于购物车的东西)。 然而,我找不到任何关于如何向会话(匿名用户)读写变量的好例子 我正在使用Visualforce页面,其中有几个内置在Apex中的控制器 关于自定义设置缓存在应用程序级别,这可能就是上面链接中建议的原因。我不确定我是否会推荐这种方法,但你也许能让它发挥作用 如果创建名为“SessionData”的自定义设置,并

我希望能够在Salesforce网站页面中读/写一些变量到当前会话

我有一个使用Salesforce站点构建的站点,我需要在所有页面中存储/检索一些值(假设我正在构建类似于购物车的东西)。 然而,我找不到任何关于如何向会话(匿名用户)读写变量的好例子

我正在使用Visualforce页面,其中有几个内置在Apex中的控制器


关于

自定义设置缓存在应用程序级别,这可能就是上面链接中建议的原因。我不确定我是否会推荐这种方法,但你也许能让它发挥作用

如果创建名为“SessionData”的自定义设置,并添加自定义字段(表示要在会话中存储的数据),则可以按如下方式将数据保存到其中:

Database.SaveResult result = Database.insert(new SessionData__c(YourFieldHere='Your value here etc'));
System.debug(result.getID());
if (SessionData__c.getAll().containsKey('unique ID from cookie here'))
{
     System.debug(SessionData__c.getInstance('unique ID from cookie here').YourFieldHere);
}
然后使用生成的自定义设置ID存储在cookie中。虽然可以使用普通的SOQL访问自定义设置,但优点是数据是缓存的,可以像这样访问:

Database.SaveResult result = Database.insert(new SessionData__c(YourFieldHere='Your value here etc'));
System.debug(result.getID());
if (SessionData__c.getAll().containsKey('unique ID from cookie here'))
{
     System.debug(SessionData__c.getInstance('unique ID from cookie here').YourFieldHere);
}
请记住,自定义设置并不是专门为此而设计的,所以您需要像正常会话管理系统那样定期清除旧的自定义设置数据

有关更多详细信息,请参阅。

我认为可能对您有用:

包含表单组件的Visualforce页面还包含一个加密的隐藏表单字段,该字段封装了页面的视图状态。这个视图状态是自动创建的,顾名思义,它保持页面状态的状态,包括组件、字段值和控制器状态

你应该用这个

您也可以使用,但是您需要确保每个请求都命中服务器(而不是缓存层)

对于Apex Cookie,可以使用以下代码:

//Setting Cookie
public void setCookie() {
    Cookie userCookie = new Cookie('CookieName', fieldValueToBeStoredAsCookie, null, 315569260, false); //Here 315569260 represents cookie expiry date = 10 years. You can set this to what ever expiry date you want. Read apex docs for more details.
    ApexPages.currentPage().setCookies(new Cookie[] {
        userCookie
    });
}

//Reading Cookie 
Cookie cookie = ApexPages.currentPage().getCookies().get('CookieName');
if (cookie != null) {
    String fieldValueToBeStoredAsCookie = cookie.getValue();        
}

如果您正在构建购物车或“向导”之类的东西,其中需要在从一个页面视图到另一个页面视图的上下文中保留控制器变量,那么在VisualForce中实现这一点的最佳方法是使用相同的控制器

当用户提交表单(通过actionFunctions、commandButtons或commandLinks等)并且控制器返回页面引用时,如果新的visual force页面使用相同的控制器,则视图状态将保留

例如,通过这种方式,您可以让用户在第一页上使用apex:inputField标记输入他们的姓名和电子邮件地址。它们导航到第二页,该页使用与第一页相同的控制器,并且该页可以引用相同的控制器变量。本质上,控制器仍然在作用域中,更新的所有变量也在作用域中

例如:

第一页:

<apex:page controller="myController">
   Please enter your name <apex:inputText value="{!shopper_name}"/>
   <br/>
   <apex:commandButton action="{!pageTwo}" value="Click for page two"/>
</apex:page>

我还问了这个问题:不可能使用Cookie,也不可能使用同一控制器来存储更安全的值,我怀疑如果用户按CTRL+F5键,并且我找不到任何关于如何读取/写入自定义设置的示例(如该答案中所述),该解决方案是否有效在Apex for Every anonymous user中,我希望每个用户的数据只能由他访问。不是真的,我正在寻找可以跨页面工作的东西,而不是特定于某个页面。Cookie不安全,我无法在客户端机器上存储机密信息(甚至加密)。如果您有机密信息,您可能应该对每个用户进行身份验证。