在的HTTP错误代码的预期目的而言,我肯定会用403 Forbidden
去,因为页面不存在(404出),但用户禁止访问它,现在(和这个限制不是由于资源冲突,如同时修改,但由于用户的帐户状态,即我认为409也是如此。基于其预期目的的另一个明智的选择可能是401,但正如他的评论中已经注意到的那样,此代码会触发一些(如果不是全部的话)浏览器显示登录对话框,因为这意味着使用标准Web认证机制可以解决问题。所以,这绝对不是您的选择。
两件事情似乎在403的描述有点“misfitting”,所以让我解决这些问题:
- 授权不会帮助...:有关HTTP内部授权机制这只会谈协议,旨在区分403与401。此声明不适用于任何形式的自定义授权或会话状态管理。
- ...请求不应该重复...:请求必须始终在会话上下文中看到,因此如果用户的会话上下文发生更改(他解锁某个功能),然后他重试访问相同的资源,这是一个不同的要求,即没有违反这一建议。
当然,你也可以定义自己的错误代码,但由于它可能不会在任何官方的方式保留,也不能保证,一些浏览器厂商是不会有意或无意地使用完全相同该代码来触发特定的(调试)操作。这是不可能的,但不被禁止。
418也可以,但是。 :)
当然,如果您想特别隐藏功能的潜在可用性,您也可以决定使用404,因为这是不给任何黑暗用户任何提示的唯一方法。现在
,你的缓存问题:
无论这些状态代码(403,404,409,418)应该触发浏览器缓存页面违背自己的意愿比其他任何一个。问题是,许多浏览器只是试图缓存一切就像疯了一样,以加快速度。在我看来,歌剧是最糟糕的。我在这些事情上多次拉我的头发。它应该可以使用正确的标题设置来处理它,但是我有过浏览器或服务器或某个中间代理决定忽略它们并且无论如何都会中断我的页面的情况。
到目前为止我发现的绝对肯定保证重新加载的唯一可靠方法是添加一个虚拟请求参数,如/ fields?t = 29873,其中29873是每个请求所独有的数字在任何可能相关的时间范围内。当然,在服务器上,你可以简单地忽略这个参数。请注意,仅当用户首次打开页面时,从1开始并不足以满足以下请求,因为浏览器可能会跨页重新加载缓存。
我做我的Web开发中的Java(服务器和使用GWT客户端),我用这个代码来生成虚拟的“数字”:
private static final char[] base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_.".toCharArray();
private static int tagIndex = 0;
/**
* Generates a unique 6-character tag string that is guaranteed to not repeat
* for about 400 days, if this function is, on average, not called more often
* than twice every millisecond.
*
* @return the tag string
*/
public static String nowTag() {
int tag = (int) ((System.currentTimeMillis() >>> 5)); // adjust
char[] result = new char[6];
result[5] = base64chars[(tagIndex++) & 63];
result[4] = base64chars[tag & 63];
tag >>>= 6;
result[3] = base64chars[tag & 63];
tag >>>= 6;
result[2] = base64chars[tag & 63];
tag >>>= 6;
result[1] = base64chars[tag & 63];
tag >>>= 6;
result[0] = base64chars[tag & 63];
return new String(result);
}
它使用系统的时钟结合一个计数器能够每ms提供约两个保证唯一值。您可能不需要这种速度,所以您可以随时更改我标记为“调整”的>>> 5
以符合您的需求。如果你将它增加1,你的利率下降两倍,你的唯一性时间加倍。因此,例如,如果您将>>> 8
代替,则可以每4毫秒生成一个值,并且这些值不应在3200天内重复。当然,如果用户使用系统时钟混淆,这种保证值不会重复的情况将会消失。但是,由于这些值不是按顺序生成的,所以您很可能不会再次输入相同的数字。该代码生成一个6个字符的文本字符串(base64),而不是一个十进制数字,以使URL尽可能短。
希望这会有所帮助。:)
我不知道正确的答案,但下面的帖子提供了一些有趣的参数:http://stackoverflow.com/questions/3297048/403-forbidden-vs-401-unauthorized-http-responses – RobJohnson 2013-02-21 16:22:57
为什么不到只是重定向到他们被允许在的页面?也可能显示弹出窗口,说该功能尚未提供。 – 2013-02-21 22:11:57
顺便说一句,'401 Unauthorized'会是一个坏主意,因为这个状态码仅用于HTTP身份验证,浏览器专门处理这个状态码。 – nalply 2013-02-22 21:17:57