2011-02-09 244 views
4

我希望能够在Salesforce网站页面中读取/写入当前会话的一些变量。Salesforce会话变量,在会话中设置并获取变量

我有一个使用Salesforce Sites构建的网站,我需要在所有页面中存储/检索一些值(考虑构建类似于购物车的东西)。 但是我无法找到任何有关如何读取和写入会话变量(匿名用户)的好例子。

我正在使用Visualforce页面和几个内置于Apex的控制器。

问候

+0

我也通过这个问题去// forums.sforce.com/t5/Visualfor ce-Development/Storing-and-Accessing of-Session-variables-in-APex-Page-aswell/mp/153871 使用cookies是不可能的,我想要更安全的地方来存储值 也使用相同的控制器是不可能的,我怀疑这种解决方案将工作,以防用户击中CTRL + F5 –

+0

而我找不到任何关于如何在Apex中为每个匿名用户读/写自定义设置的例子(如答案中所述)我希望每个用户的数据只能由他访问 –

+0

请参阅http://stackoverflow.com/questions/6103363/how-to-get-in-a-visualforce-page-controller-a-value-from-a-custom -component-cont/6104307#6104307 – 2011-10-18 20:14:58

回答

3

自定义设置,在应用程序级缓存,也许这就是为什么它在链接建议以上。我不确定我是否会推荐这种方法,但您可能能够使其发挥作用。

如果你创建了一个名为“SessionData”自定义设置,并添加自定义字段(即表示要在会话存储数据),你可以将数据保存到这样的:

Database.SaveResult result = Database.insert(new SessionData__c(YourFieldHere='Your value here etc')); 
System.debug(result.getID()); 

然后使用生成的自定义设置ID存储在cookie中。虽然自定义设置可以使用常规SOQL进行访问,其优点是数据缓存,可以这样来访问:

if (SessionData__c.getAll().containsKey('unique ID from cookie here')) 
{ 
    System.debug(SessionData__c.getInstance('unique ID from cookie here').YourFieldHere); 
} 

请记住,自定义设置并没有真正专为这一点,所以你需要定期清除旧的自定义设置数据,就像正常的会话管理系统一样。

查看Apex Custom Settings documentation了解更多详情。

0

我想Visualforce View State可能对你有用:包含一个表单组件也包含封装在页面视图状态的加密,隐藏的表单字段

Visualforce页面。这个视图状态是自动创建的,正如其名称所暗示的那样,它保存着包含组件,字段值和控制器状态的页面状态。

+0

不是,我正在寻找可以跨页面工作的东西,而不是特定于某个页面。 –

0

您应该为此使用Javascript cookies

你也可以使用Apex cookies,但是你需要确保每个请求都到达服务器(而不是缓存层)。

为顶点的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();   
} 
+0

Cookies不安全,我无法在客户端计算机上存储保密信息(甚至是加密的) –

+0

如果您有保密信息,则应该对每个用户进行身份验证。 –

3

如果您正在构建像购物车,或“向导”,你需要保持控制变量的情况下,从一个页面浏览到另一个,那么在VisualForce中执行此操作的最佳方法是使用相同的控制器。

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

通过这种方式,您可以让用户使用第一页上的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> 

第二页:

<apex:page controller="myController"> 
    You entered: <apex:outputText value="{!shopper_name}" />. 
</apex:page> 

控制器: HTTP:

public class myController { 
    public string shopper_name { get; set; } 
    public myController() { 
    shopper_name = null; 
    } 
}