您的位置:

401和403状态码

一、401状态码

401状态码是HTTP协议中的一种响应状态码,它表示客户端请求需要进行身份验证,身份验证失败或没有提供凭据时将收到401响应。

常见情况下,当访问需要权限的页面时,客户端会弹出身份验证框,供用户输入账号密码,此时客户端会将账号密码打包成HTTP请求发送给服务端,服务端通过验证后才会返回正常的响应结果。

如果客户端提供的凭据不正确或者客户端在没有提供凭据的情况下试图访问需要验证才能访问的资源,服务端会返回401状态码,客户端需要重新进行身份验证。

代码示例:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="My Server"
Content-Type: text/html

<html>
<head><title>401 Unauthorized</title></head>
<body>
<h1>401 Unauthorized</h1>
<p>You are not authorized to access this page.</p>
</body>
</html>

二、403状态码

403状态码是HTTP协议中的一种响应状态码,它表示客户端请求的资源禁止访问。

常见情况下,403状态码是由服务端发生的权限校验错误引起的,服务端根据不同的业务规则判断客户端是否有权限访问资源,如果没有权限,服务端会返回403状态码。

需要注意的是,当返回403状态码时,与401状态码不同的是,客户端并不需要重新进行身份验证。

代码示例:

HTTP/1.1 403 Forbidden
Content-Type: text/html

<html>
<head><title>403 Forbidden</title></head>
<body>
<h1>403 Forbidden</h1>
<p>Access to the specified resource has been forbidden.</p>
</body>
</html>

三、401和403的区别

401和403都是表示访问被禁止,但是它们代表的含义是不同的。

401状态码表示客户端请求需要进行身份验证,而此时客户端未提供凭据或提供的凭据不正确,客户端需要重新进行身份验证。

而403状态码表示客户端请求被禁止,服务端明确告知客户端这个请求是不被允许的,客户端无需重新进行身份验证。

四、错误排查

在实际开发过程中,当我们遇到401或403状态码时,需要针对具体情况进行错误排查。

要想解决401状态码问题,需要首先确认账号密码是否正确,其次检查服务端身份验证的代码是否能够正确调用。如果服务端没有进行身份验证,需要根据业务规则对接口进行修改,让其进行身份验证。

要想解决403状态码问题,需要先确认客户端访问的资源是否有权限访问,如果没有权限,需要根据业务规则修改接口权限配置。

代码示例:

服务端代码验证身份:

if (password != userinfo.getPassword()) {
    response.setStatus(401);
    response.addHeader("WWW-Authenticate", "Basic realm=\"My Server\"");
    response.setContentType("text/html");
    out.println("<html><body>");
    out.println("<h1>401 Unauthorized</h1>");
    out.println("</body></html>");
} else {
    // 访问成功逻辑
}

服务端代码判断权限:

if (!checkAccess(userinfo, requestURI)) {
    response.setStatus(403);
    response.setContentType("text/html");
    out.println("<html><body>");
    out.println("<h1>403 Forbidden</h1>");
    out.println("</body></html>");
} else {
    // 访问成功逻辑
}

五、总结

401和403状态码是常见的HTTP响应状态码,它们代表不同的含义。如果我们能够正确理解它们的语义,就可以在排除错误时事半功倍。