• HTTP基本认证(Basic Authentication)的JAVA演示样例


    大家在登录站点的时候。大部分时候是通过一个表单提交登录信息。
    可是有时候浏览器会弹出一个登录验证的对话框。例如以下图,这就是使用HTTP基本认证。

    以下来看看一看这个认证的工作过程:
    第一步:  client发送http request 给server,server验证该用户是否已经登录验证过了,假设没有的话,
    server会返回一个401 Unauthozied给client,而且在Response 的 header "WWW-Authenticate" 中加入信息。


    例如以下图。



    第二步:浏览器在接受到401 Unauthozied后,会弹出登录验证的对话框。用户输入username和password后,
    浏览器用BASE64编码后。放在Authorization header中发送给server。例如以下图:

    第三步: server将Authorization header中的usernamepassword取出,进行验证, 假设验证通过,将依据请求,发送资源给client。



    以下来看一个JAVA的演示样例代码:

    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import sun.misc.BASE64Decoder;
    
    public class HTTPAuthServlet extends HttpServlet {
    	
    	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    		String sessionAuth = (String) request.getSession().getAttribute("auth");
    
    		if (sessionAuth != null) {
    			System.out.println("this is next step");
    			nextStep(request, response);
    
    		} else {
    
    			if(!checkHeaderAuth(request, response)){
    				response.setStatus(401);
    				response.setHeader("Cache-Control", "no-store");
    				response.setDateHeader("Expires", 0);
    				response.setHeader("WWW-authenticate", "Basic Realm="test"");
    			}			
    
    		}
    
    	}
    
    	private boolean checkHeaderAuth(HttpServletRequest request, HttpServletResponse response) throws IOException {
    
    		String auth = request.getHeader("Authorization");
    		System.out.println("auth encoded in base64 is " + getFromBASE64(auth));
    		
    		if ((auth != null) && (auth.length() > 6)) {
    			auth = auth.substring(6, auth.length());
    
    			String decodedAuth = getFromBASE64(auth);
    			System.out.println("auth decoded from base64 is " + decodedAuth);
    
    			request.getSession().setAttribute("auth", decodedAuth);
    			return true;
    		}else{
    			return false;
    		}
    
    	}
    
    	private String getFromBASE64(String s) {
    		if (s == null)
    			return null;
    		BASE64Decoder decoder = new BASE64Decoder();
    		try {
    			byte[] b = decoder.decodeBuffer(s);
    			return new String(b);
    		} catch (Exception e) {
    			return null;
    		}
    	}
    
    	public void nextStep(HttpServletRequest request, HttpServletResponse response) throws IOException {
    		PrintWriter pw = response.getWriter();
    		pw.println("<html> next step, authentication is : " + request.getSession().getAttribute("auth") + "<br>");
    		pw.println("<br></html>");
    	}
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
    		doGet(request, response);
    	}
    
    }
    当request第一次到达server时。server没有认证的信息,server会返回一个401 Unauthozied给client。
    认证之后将认证信息放在session,以后在session有效期内就不用再认证了。

  • 相关阅读:
    机器学习框架之sklearn简介
    ubuntu 16.04下使用 python pip的安装问题。
    ubuntu 16.04 搭建git小型服务器
    使用config 来管理ssh的会话
    【linux】su、sudo、sudo su、sudo -i的用法和区别
    【python】确保文件写入结束
    【python】描述符descriptor
    【python】类(资料+疑惑)
    【pymongo】mongodb cursor id not valid error
    【python】继承关系和isinstance
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6931649.html
Copyright © 2020-2023  润新知