zoukankan      html  css  js  c++  java
  • 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有效期内就不用再认证了。

  • 相关阅读:
    Redis数据类型有哪些?
    什么情况下调用doGet()和doPost()?
    .JSP中动态include和静态include的区别?
    .Request对象的主要方法有哪些?
    Redis数据类型有哪些?
    Redis的特点什么是?
    请写出常用的linux指令
    接口绑定有几种实现方式,分别是怎么实现的?
    什么是 MyBatis 的接口绑定,有什么好处?
    MyBatis 的好处是什么?
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6931649.html
Copyright © 2011-2022 走看看