代码之家  ›  专栏  ›  技术社区  ›  GorillaApe

会话中存储的错误消息

  •  12
  • GorillaApe  · 技术社区  · 15 年前

    将错误消息存储在 SESSION ? 例如在重定向之后。通过url传入对我来说不是一个解决方案。。。 我想知道这是不是一个好的解决办法。。。因为。。

    用户的一致提交是否会导致问题?(长时间发帖,而ajax内容是从另一个选项卡获得的)这可能会扰乱会话!或者那是不可能发生的?

    如果用户提出请求,但由于某种原因无法显示页面,则消息可能会显示在不相关的页面上!

    所以呢?有其他选择吗??
    例如,当使用POST/redirected/get模式时

    7 回复  |  直到 11 年前
        1
  •  7
  •   KingCrunch    15 年前

    在会话中存储错误消息时,必须注意,在显示之前,两个请求不会覆盖另一个消息。你必须注意,一个页面,应该显示一个消息,只显示它自己的消息。

    当错误发生时,应该显示错误,而不是以前的重定向。在这种情况下,也没有理由重新定向。

        2
  •  4
  •   Quentin    15 年前

    在会话中存储错误消息是一个好的做法吗?例如在重定向之后。

    不是一般的。会话数据应该是重要时期的数据,错误通常是单个请求的结果,而细节不需要持久化。

    在会话中存储此类数据只是竞赛条件的邀请。

        3
  •  2
  •   Florin Andrei    11 年前

    为什么不给他们分配一个特定的id,比如error\u id=2,然后通过url发送? 或者这对你来说也是不可能的? 也可以通过会话发送错误id。。。

        4
  •  1
  •   Kamal Soni    11 年前

    在会话中存储错误消息并不少见,特别是在可能存在多个重定向的情况下。Zend framework有类似flash messenger的东西,哪一种可以做到这一点。

    会话中的任何内容都将保留在会话中,直到您销毁它或会话超时。最好的做法是将错误消息存储在会话中,然后当页面加载需要显示错误消息时,您的代码将从会话中获取消息并在它们存在时显示它们。显示错误消息后,您需要将其从会话中删除,否则每次用户转到此页时,都会看到相同的错误消息一次又一次弹出。

    最好的方法是显示和删除。

    我相信如果你用这种方法,你就不会遇到任何问题。原因是,如果提交了不正确的表单,则表单中始终会有错误,并且它将始终尝试在会话中存储这些错误消息并相应地显示它们,而不管它们在会话中添加/删除了多少次。我希望这一切都有意义。

    另外,当您存储会话错误消息时,您需要智能地存储它们,以便后端知道这些错误消息是为哪个表单存储的。

        5
  •  1
  •   Fabian Kleiser    11 年前

    关注用户! 您的所有开发工作都希望提供最好的用户体验。

    第一个问题是,你为什么需要信息?

    • 如果是 成功的请求 ,您希望用户知道他的请求已成功执行。
    • 如果是 错误的请求 ,您可以区分:如果请求可能是 改变了的 由用户转换为成功的请求,然后显示 有益的 错误信息(例如,简单的表单提交)。如果用户不能更改请求,请尽可能提供信息 为什么? 请求失败(例如,“无法执行,因为服务XY不可用”。请联系技术支持等)。

    容易:可能被更改的错误请求:

    如果用户可能更改请求的错误请求,不要将其保存在会话中,而是直接呈现用户可以更正其请求的页面。

    困难:成功的请求或不可更改的错误请求:

    在这里,您通常希望用户在点击F5或执行类似操作后不能再次执行完全相同的请求,因此您可以重定向用户。在这种情况下,我个人喜欢使用flash消息组件的解决方案(请参见 Symfony Docs Zend Docs 例如)。一般来说,如果应用程序满足以下假设,则此技术不会导致竞争条件:

    • 从浏览器发出的HTTP请求执行得很快。同时,用户没有真正的机会触发第二个请求。
    • 您的AJAX调用不会影响flash消息,或者,如果您返回结构化数据(XML,JSON),您可以包含一个flash消息的特殊部分,然后由Javascript呈现。

    现在,要最小化错误率,可以执行以下操作:

    • 存储添加闪存消息时的时间戳。不要显示旧消息(例如1分钟)。移动用户可能会断开连接,然后重试。他希望申请处于什么状态?
    • 不要让用户和服务器之间的HTTP请求花费太长时间。如果需要执行长计算,请尝试将内容卸载到后台工作进程,并向用户显示处理状态。

    总结: 如果您有关于HTTP通信的一般良好实践,那么用户是 不可能的 能够搞乱闪光信息。权衡利弊,把重点放在用户,而不是你的实现的复杂性,因为有一些方法来应付这个问题。

        6
  •  0
  •   Hristo Georgiev    11 年前

    一般来说:

    尽量多放在客户端(javascript和cookies),尽量少存储在服务器端。

    这包括SESSION变量,在最好的情况下,它应该只包含用户id。

    如果消息在重定向之后,则可以添加一个请求变量,该变量可以对消息进行索引并以这种方式显示消息。

        7
  •  -1
  •   Kevin Nagurski    11 年前

    您可以在URL中传递错误代码,然后使用该代码查找错误,而不是存储在会话中。我为这类事情提供了用户裸体异常类:

    class MyException extends Exception
    {
        const USER_NOT_FOUND = 'The requested user was not found';
        // ...
    }
    

    那么你的重定向url将是 /controller/action/error/USER_NOT_FOUND 你可以用它来查找信息:

    echo constant('MyException::' . $error);
    

    你不需要使用 Exception 但它能让你保持东西的整洁

    if ($errorState) {
        throw new MyException(
            MyException::USER_NOT_FOUND
        );
    }
    
    推荐文章