【问题标题】:PHP session / json / javascriptPHP会话/json/javascript
【发布时间】:2019-04-24 10:07:11
【问题描述】:

我需要弄清楚为什么我不能为 JSON 对象获取这个 JS 会话。我确定我错过了一些简单的东西。

我在 laravel 中设置了一个 Session 变量

Session::put('test', "{'test1':'123','test2':'456'}");

我想在 js 的页面中设置这个:

<script>var testvar = "{{\Session::get('test')}}";

然后我尝试在 js 中执行此操作:

var test_json = JSON.parse(testvar);

但我看到 js testvar 设置了引号编码?

我做错了什么???

【问题讨论】:

  • 为什么要在刀片中使用Session?您需要将这些值作为参数传递给刀片,遵守 MVC。
  • @Andreas 如果它像鸭子一样走路和像鸭子一样说话,那么它就是一个 json 对象。 :)~
  • @JustinSchwimmer 如果有问题,那就是错误的。仅仅因为某个网站使用了错误的术语并不能说明它是正确的。
  • @Andreas 如果错了 - 我们必须纠正错误。有时,为了纠正错误,你必须做正确的事情。

标签: javascript php laravel session


【解决方案1】:

问题

您的以下代码

<script>
   var testvar = "{{\Session::get('test')}}";
   var data = JSON.parse(testvar);
</script>

会被解释为:

<script>
   var testvar = {'test1':'123','test2':'456'};
   var data = JSON.parse(testvar);
</script>

{'test1':'123','test2':'456'} 是无效的 JSON,因为您需要使用双引号而不是单引号。

所以你需要:

Session::put('test', '{"test1":"123","test2":"456"}');

但这又产生了另一个问题。

出于安全原因,Laravel 自动转义 HTML 以避免 XSS 攻击。

这意味着上面的内容现在被解释为:

<script>
    var testvar = {&quot;test1&quot;:&quot;123&quot;,&quot;test2&quot;:&quot;456&quot;}&quot;
    var data = JSON.parse(testvar);
</script>

如果你确定你存储的数据是安全的,你可以像这样使用原始标签,并避免使用JSON.parse(这样我们就不需要再次转义任何引号)像这样:

<script>
    var testvar = {!! Session::get('test') !!};
</script>

这将输出 HTML:

<script>
    var testvar = {"test1":"123", "test2":"456"};
</script>

更好的解决方案

更好的方法是将数据作为数组存储在 PHP 会话中:

Session::put('test', [
    'test1' => '123',
    'test2' => '456'
]);

那么你可以这样做:

<script>
    var testvar = @json(Session::get('test'));
</script>

这里解释: https://laravel.com/docs/5.7/blade#displaying-data

旁注

作为旁注,考虑将变量传递给刀片,以避免在您的视图中执行如下逻辑:

return view('your-view-name', [
    'testvar' => Session::get('test'),
]);

那么你可以这样做:

<script>
    var testvar = @json($testvar);
</script>

【讨论】:

  • 属性(如果需要,还包括值)必须用双引号括起来
  • 不,他们没有。我认为您对 JSON 感到困惑。 JavaScript 对象允许使用单引号和双引号的属性和值。
  • 我不明白......你是说在 Session var 中设置一个数组然后这样做? var app = @json(Session::get('test'));
  • 我提供了 2 个解决方案。如果无法更改会话数据,则使用原始刀片标签。但是,最好将会话数据设置为数组,而不是编码的 JSON 数据,并使用var testvar = @json(Session::get('test'));
  • 在您的第一个答案版本中,您使用的是"{!! Session::get('test') !!}",必须对其进行解析,否则它只会是一个字符串。为了使这个 JSON 成为有效的 JSON,属性必须用双引号括起来,而 TO (Session::put('test', "{'test1':'123','test2':'456'}");) 的设置则不是这种情况
猜你喜欢
  • 1970-01-01
  • 2017-07-08
  • 2012-12-02
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 2012-05-18
  • 2013-07-22
相关资源
最近更新 更多