Http协议WWW-Authenticate

HTTP协议有一个叫WWW-Authenticate的头字段,可以用于实现登录验证。它是在RFC 2617中定义的。
当服务器接收到一个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类型的验证模式。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值