码迷,mamicode.com
首页 > Web开发 > 详细

【HTTP】http 401Basic验证和WWW-Authenticate、Authorization

时间:2015-05-31 10:58:08      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:http   401   www-authenticate   authorization   响应头   

借阅资料:《HTTP使用BASIC认证的原理及实现方法》


        翻看HTTP协议原书,第三部分第十一章 识别、认证与安全,当cookie禁用的时候可以利用401状态码以及响应头WWW-Authenticate来进行。cookie被禁用,一是服务不可用,提醒用户开启cookie功能,譬如网易163邮箱就是这么干的;另一个就是URL重写,java中response.encodeURL方法会自动判断客户端是否禁用cookie然后在url后main追加选项JSESSIONID,但是这种编码比较麻烦。

        小网站可以利用401状态码和响应头WWW-Authenticate来搞一搞,玩一下,但是这种方式很不安全···base64太容易就被破解了。

        另外,需要知道的是,在第一次认证的时候,初次响应是没有完整的响应头的;在认证过后,浏览器在会话存活之间,每一次请求都会带着请求头Authorization,如下截图。

技术分享

技术分享

package cn.wxy.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;

@WebServlet("/auth")
public class AuthServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		
		String auth = request.getHeader("Authorization");
		if(hasAuth(auth, response)){
			auth = new String(Base64.decode(auth.split(" ")[1]));
			System.out.println(auth);
			/**
			 * 进行验证:输出结果
			 * 解码前:Basic emhhbmdzYW46MTIz
			 * 解码后:zhangsan:123(username: password)
			 */
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
	
	/**
	 * 用于验证请求头中是否包含Authorization信息
	 * 想知道更多关于401验证,请查看request.getAuthType()
	 * @param auth
	 * @param response
	 * @return
	 */
	private boolean hasAuth(String auth, HttpServletResponse response){
		if(auth == null || auth.trim().equals("")){
			response.setStatus(401);
			response.setHeader("WWW-Authenticate", "Basic realm=\"localhost\"");
			return false;
		}
		return true;
	}
}


附注:

        一时兴起,看了一下401头····

【HTTP】http 401Basic验证和WWW-Authenticate、Authorization

标签:http   401   www-authenticate   authorization   响应头   

原文地址:http://blog.csdn.net/reliveit/article/details/46285285

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!