如何更改会话数据并保持在同一页面上?

Posted

技术标签:

【中文标题】如何更改会话数据并保持在同一页面上?【英文标题】:How to change session data and stay on same page? 【发布时间】:2012-07-20 21:25:43 【问题描述】:

我想用四个标签('a'、'b'、'c'、'd')过滤我网页上的数据。假设用户在这个页面上:

/data/1/slug-for-one

并且用户想要现在为“c”过滤的数据,他点击“c”,他的会话对象中的一个 var 被更改,并且在“重新加载”同一页面时正确过滤了数据。

如何构建过滤器按钮的链接?创建一个特殊的控制器,它解析过滤器并重定向?控制器在哪里获取要重定向的 url?我不想通过 GET 传递路由/url,因为用户可能会做坏事。

编辑:

正如 cmets 中所指出的,在会话中使用过滤器是个坏主意。那么通过过滤器的最佳方法是什么?是否可以设置一些可以在实际控制器之前解析的路由前缀?

示例:

/filter/c/data/1/slug-for-one

【问题讨论】:

您可以使用 POST 请求并为处理此问题的特殊控制器添加用于发布请求的路由 此数据必须驻留在会话数据中是否有原因?它只是看起来像错误的地方。听起来它应该是一个参数(GET/POST)。另外,如果用户打开了多个带有不同标签的页面/标签怎么办? 【参考方案1】:

您可以使用 POST 请求发送变量,然后使用自定义操作对其进行处理。像这样的:

<?php
// src/Acme/DemoBundle/Controller/DataController.php
namespace Acme\DemoBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
// ...

class DataController extends Controller

    /**
     * @Route("/data/id/slug")
     * @Method("POST")
     */
    public function filterAction($id, $slug)
    
        $tag = $this->getRequest()->get('tag');

        // ... filter it by tag and 
    

?>

或者只是在当前操作中创建一个if,以检查请求是否为 POST 请求,然后对其进行过滤。

<?php
if ('POST' == $this->getRequest()->getMethod()) 
    // ... filter

?>

【讨论】:

这适用于一条路线/页面。过滤器需要在所有页面上都处于活动状态,并且必须至少选择一个标签。这将导致每个链接都发送听起来很难看的 POST 数据。

以上是关于如何更改会话数据并保持在同一页面上?的主要内容,如果未能解决你的问题,请参考以下文章

session会话保持的几种方式并举例实现

Ajax请求如何保持同一会话session

kubernetes session会话保持

Nginx 会话保持

如何防止 Ajax 调用使会话保持活动状态?

负载均衡设备会话保持机制介绍