HTTP协议有一个叫WWW-Authenticate的头字段,可以用于实现登录验证。它是在RFC 2617中定义的。
当服务器接收到一个request,并在实现下面的代码:
浏览器接收的并不是这个请求的response,也就是说这个请求并没有结束,而是接收了一个新的request,表现就是浏览器会直接弹出一个验证窗口,只有我们在这个验证窗口填入正确的验证信息,再去后台请求,返回的才是上一个request的response。
而当我们我们将Basic随便改成自己定义的key
浏览器接收到的是一个401错误的response,并不会自动弹出窗口。
而关于弹出的验证窗口的request,则是前面后台包装好的Basic类型,所以这个验证窗口再次发出的请求的内容如下
所以在后台,我们还得再加上对Base64的反编译。
当然,我们如果想让自己在js中写的前台验证请求也模拟WWW-Authenticate,我们可以再js中做以下模拟:
则向后台的验证请求与前面弹出窗口的请求就一样了,
然后在后台调用上面写的反编译就可以了。
当然,现在流行http请求而不是https请求,最好不要用Basic而是Digest类型的验证模式。
当服务器接收到一个request,并在实现下面的代码:
http_response.addHeader('WWW-Authenticate', 'Basic realm...');
http_response.setContentType(MimeTypeConstants.textHtml);
http_response.setCharacterEncoding('UTF-8');
http_response.setStatus( HttpServletResponse.SC_UNAUTHORIZED);
final PrintWriter pw = http_response.getWriter();
pw.write("...");
pw.flush();
http_response.flushBuffer();
浏览器接收的并不是这个请求的response,也就是说这个请求并没有结束,而是接收了一个新的request,表现就是浏览器会直接弹出一个验证窗口,只有我们在这个验证窗口填入正确的验证信息,再去后台请求,返回的才是上一个request的response。
而当我们我们将Basic随便改成自己定义的key
http_response.addHeader('WWW-Authenticate', '随便自定义的key realm...');
http_response.setContentType(MimeTypeConstants.textHtml);
http_response.setCharacterEncoding('UTF-8');
http_response.setStatus( HttpServletResponse.SC_UNAUTHORIZED);
final PrintWriter pw = http_response.getWriter();
pw.write("...");
pw.flush();
http_response.flushBuffer();
浏览器接收到的是一个401错误的response,并不会自动弹出窗口。
而关于弹出的验证窗口的request,则是前面后台包装好的Basic类型,所以这个验证窗口再次发出的请求的内容如下
Authorization: Basic base64编码过的登录信息
所以在后台,我们还得再加上对Base64的反编译。
String auth = http_request.getHeader('Authorization')
String authType = auth.substring(0,auth.indexOf(' '));
if(authType.equalsIgnoreCase('base')){
Base64.decode(auth.substring( auth.indexOf(' ')+1));
}
当然,我们如果想让自己在js中写的前台验证请求也模拟WWW-Authenticate,我们可以再js中做以下模拟:
beforeSend:function(re){
re.setRequestHeader("Authorization", "Basic Base64编码过的登录信息")
}
或
$ajaxSetup({
headers:{
'Authorization' : 'Basic Base64.encode(usdid:psd)';
}
})
则向后台的验证请求与前面弹出窗口的请求就一样了,
然后在后台调用上面写的反编译就可以了。
当然,现在流行http请求而不是https请求,最好不要用Basic而是Digest类型的验证模式。