标签:http 401 www-authenticate authorization 响应头
翻看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