将JavaScript函数存储在Cookie中?

时间:2016-02-24 19:18:41

标签: javascript angularjs cookies

是否可以在Cookie中保存JavaScript功能?如果是这样,怎么样?

例如,我有键盘快捷键的用户设置,但与每次击键相关的行为可以是自定义的。我希望将这些可能独特且用户特定的映射保存在cookie中。

我目前正在使用Angular 1.4.7来放置cookie。它返回的数据剥离了函数。

3 个答案:

答案 0 :(得分:3)

不应该将功能保存在cookie中。相反,您应该使用用户可以执行的所有可能方法创建一个对象,而不是存储方法名称,即:

var customUserFunctions = {
    someMethod: function() { ... },
    ...
};

然后将"someMethod"存储在Cookie中,并使用customUserFunctions[variableHoldingSomeMethodString]()调用它。

这就是说,这就是将函数存储在cookie中的方式:

// Define your function
var myFunc = function() { console.log("I'm a stored function!"); };
// Turn it into a string
var myFuncString = myFunc.toString();
// Store it in your cookie
document.cookie = myFuncString;
// get your function back
var myCookieFunc = eval(document.cookie);
// call it
myCookieFunc();

请注意,这将创建一个安全漏洞,攻击者可以在其中修改Cookie,您的代码将执行它们放在那里的任何函数。

答案 1 :(得分:0)

不,您无法在Cookie上存储功能。但是,您可以在关联数组中存储对函数的引用,并将该键存储在cookie中。这样,当加载cookie时,使用键来“重新加载”该函数。

编辑:

在我的第一个答案的基础上,理想的(IMO)解决方案是定义一个提供相同功能的工厂。这样就可以根据需要将其注入模块中。例如,你可以做(​​粗略演示):

app.factory('getUserFunctions', function(){
    return function(keyFromCookie){
      switch (keyFromCookie) {
        case "hello": return function(){
            return "Hello, world!";
        }
        case "goodbye": return function() {
            return "Goodbye, crule world";
        }
        default: return undefined;
      }
    };
});

并使用令牌调用工厂以获取对您定义的函数之一的引用:

$scope.fromFactory = getUserFunctions("goodbye");

答案 2 :(得分:-1)

您可以尝试使用Function对象。将函数的内容保存在cookie中而不是检索它,而不是将其传递给构造函数。

var str = "{alert(1)}";
var f = new Function(str);
f();

小提琴:https://jsfiddle.net/d37qzet6/

但我不认为这是这种情况下的最佳方法。