借阅资料:《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头····
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)