- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在开发网页游戏。作为游戏的一部分,您从一组有限的功能开始,然后在玩游戏时解锁更多功能。
例如,您在教程的第 3 步中解锁了 /fields
。但是,如果您只是导航到地址栏中的 /fields
呢?
我正在尝试找出响应的最佳状态代码。
403 看起来很理想,因为用户在解锁之前被禁止访问该页面。
404 也是有道理的,因为从技术上讲,该页面在解锁之前“不存在”,并且还会阻止用户区分不存在的页面和他们尚未解锁的页面。
但在这两种情况下,我都有一些用户报告浏览器缓存 403/404 结果的问题,并且即使在解锁后也不允许他们访问页面,除非他们完全清除缓存。
我想知道我是应该继续使用 403 还是 404,还是应该使用未使用的 4XX 代码,例如带有自定义状态文本的 442,或者甚至开玩笑地发送 HTTP/1.1 418 I'm A Teapot
以响应用户在他们不应该出现的地方四处张望。
我需要一个很好的、可靠的理由来说明为什么应该使用一个选项而不是其他选项。
最佳答案
tl;dr 409 Conflict
将是一个想法,但也许你有缓存问题。在这种情况下,强制重新加载的缓存破坏器将起作用。
详细解释
也许是 409 Conflict
状态码是有意义的:
10.4.10 409 Conflict
The request could not be completed due to a conflict with the current state of the resource. This code is only allowed in situations where it is expected that the user might be able to resolve the conflict and resubmit the request. The response body SHOULD include enough information for the user to recognize the source of the conflict. Ideally, the response entity would include enough information for the user or user agent to fix the problem; however, that might not be possible and is not required.
Conflicts are most likely to occur in response to a PUT request. For example, if versioning were being used and the entity being PUT included changes to a resource which conflict with those made by an earlier (third-party) request, the server might use the 409 response to indicate that it can't complete the request. In this case, the response entity would likely contain a list of the differences between the two versions in a format defined by the response Content-Type.
这是有道理的,因为资源只有在用户完成教程后才可用。在此之前,资源处于“无效”状态。并且用户可以通过完成教程来解决此冲突。
后来我进一步调查这个案子,发现细节决定成败。让我们阅读 403 Forbidden
的规范和 404 Not Found
.
10.4.4 403 Forbidden
The server understood the request, but is refusing to fulfill it. Authorization will not help and the request SHOULD NOT be repeated. If the request method was not HEAD and the server wishes to make public why the request has not been fulfilled, it SHOULD describe the reason for the refusal in the entity. This status code is commonly used when the server does not wish to reveal exactly why the request has been refused, or when no other response is applicable.
重要的是 «不应重复请求» 的规范。从不重新请求 403 页面的浏览器可能会做正确的事情。但是,让我们继续 404:
10.4.5 404 Not Found
The server has not found anything matching the Request-URI. No indication is given of whether the condition is temporary or permanent.
[omitted]
现在我们有问题了!如果规范允许它们是临时的,为什么要缓存您的 404 页面?
也许在您的设置中,您的 403 和 404 页面的缓存配置不正确。如果是这样,请咨询this answer on StackOverflow .它给出了关于缓存 4xx 页面的详细答案。
如果您不想弄乱缓存 header ,请使用所谓的缓存破坏器并像这样传递系统时间(假设 PHP 是您的网络语言):
<a href="/fields?<?php echo time(); ?>">
这会生成类似 /fields?1361948122
的 URL , 每秒增加。这是 Markus A 提出的解决方案的变体。
我假设查询字符串 1361948122
被您的资源忽略。如果不是,则改为在查询字符串参数中传递缓存破坏器,例如 t=1361948122
并确保参数 t
未由您的资源评估。
关于http - 什么响应代码适合这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14949495/
我正在创建一个 sql server 存储过程,它将输入作为逗号分隔的 productid 或选项“全部”。当用户传入逗号分隔的产品 ID 时,查询应输出所有产品 ID 的数据。我使用“IN”语句执行
我有一个自动生成的 Web 服务客户端。我有很多复杂的类,我必须对其进行模式匹配。现在我的结构如下所示: val response = client.getResponse response matc
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 7年前关闭。 Improve this
我需要正确的 tsql 语法来解决这个问题: Select * from table where var_A='10' select * from table where var_B='10' 何时使
我遇到了这个问题。每当我运行程序并在需要时键入字母 m 时,我的 if 语句都不会识别它。有人知道为什么吗?我已经这样做了一个小时,但没有结果。 #include #include #includ
我从数据库列名称“你有护照”创建了一个表,用户回答是或否我如何将 css 应用到这个动态工作的表。 table, th, td { border: 1px solid black;
我对 LocationListener 类的 onStatusChanged 有一些疑问。 它知道它可以呈现三种状态:AVAILABLE、TEMPORARILY_UNAVAILABLE 和 OUT_O
当引入新的异常类型时,我总是不确定如何正确地做到这一点。有共同约定吗?你怎么做呢? 我对您组织它们的范围感兴趣(将它们保留在它们所使用的单元中?在组件级别有一个单元?包级别?应用程序?) 这也会影响命
我使用以下内容创建了日期维度: https://www.codeproject.com/Articles/647950/Create-and-Populate-Date-Dimension-for-D
您好,我正在使用 Android 完全 Kiosk 浏览器,该浏览器使用 chrome Webview。但是 javascript 中的某些方法或函数无法正常工作,例如 window.print()。
我有以下代码: public void OpenFile(string FileName) { if (FileName == null)
获取索引越界异常 for (int recordData = 0; recordData < recordDataList.size(); recordData++) {
我使用它在发生错误时在登录中显示一条消息: × Invalid user or password
这是我的场景,我有一个异常列表,其中包含来自不同层次结构的任意异常,下面的代码快照将解释我需要做什么 private List connectionExceptions; try { // tryin
我尝试动态更新 Jtextpane 中的左缩进。但我不能!这是我尝试过的! DefaultStyledDocument document = (DefaultStyledDocument) textp
我不知道为什么这个异常不起作用...... import java.util.*; public class a { public static void main(String[] args
我目前在 case 中使用多个 when 时遇到问题。当我删除第二个当时,它就起作用了。这是什么问题? 报告的MYSQL错误为: #1064 - You have an error in your S
例如,我有一个表记录用户查看和下载文件的事件, file_id user activity 2 Tim view 1 Ron
这是一个非常愚蠢的问题,但我需要一点安慰/帮助。我有当前的“递归”情况: void add( int value ) { // do something ... // if ( conditi
我尝试使用以下代码在按钮数组上注册回调。但我似乎无法理解如何绑定(bind)回调中需要的字符串。任何建议将不胜感激! for (var i = 0; i < this.car_types.length
我是一名优秀的程序员,十分优秀!