http协议Authorization认证方式在Android开发中的使用

举报
江南一点雨 发表于 2021/08/16 22:52:06 2021/08/16
【摘要】 我们都知道,http协议是一种无状态协议,在Web开发中,由于Session和Cookie的使用,使得服务端可以知道客户端的连接状态,即用户只需要在浏览器上登录一次,只要浏览器没有关闭,后续所有的请求服务端都会知道这个请求是谁发来的。但是在移动端开发的过程中,却是没有Session和Cookie,所以我们要想办法来解决这个问题。一般来说,在移动端开发想要解决这个问题有三种方案...

我们都知道,http协议是一种无状态协议,在Web开发中,由于Session和Cookie的使用,使得服务端可以知道客户端的连接状态,即用户只需要在浏览器上登录一次,只要浏览器没有关闭,后续所有的请求服务端都会知道这个请求是谁发来的。但是在移动端开发的过程中,却是没有Session和Cookie,所以我们要想办法来解决这个问题。一般来说,在移动端开发想要解决这个问题有三种方案:

1.OAuth认证

2.Authorization认证

3.Cookie缓存

OAuth认证实际上就是使用令牌,这个有时间的话我们后文再说,第三种Cookie缓存则是模拟浏览器的方式,来把Cookie缓存到手机本地,可以存在sp中也可以存在数据库中,登录成功时候以后每次发起网络请求时带上这个Cookie,这样服务端就知道用户是否已经登陆了,不过这种方式在移动端开发中我们用的比较少,有的时候我们想要模拟网站登录,可以采用这个方式,关于Cookie缓存的用法可以参考使用OKHttp模拟登陆知乎,兼谈OKHttp中Cookie的使用!

好了,今天我们就来看看Authorization这种认证方式的使用,本文主要介绍该种认证方式在OkHttp中的使用。假设服务端有一个收藏的接口,该接口的调用必须要先判断用户是否已经登录,但是我们不能在每一次接口调用的时候都携带上用户登录信息,这样太麻烦了,最好能有一种方式能够自动携带上这些东西,那就是Authorization认证。

在OkHttp中使用Authorization认证是很简单的,如下:


  
  1. //第一个参数为用户名,第二个参数为密码
  2. final String basic = Credentials.basic("zhangsan", "123456");
  3. OkHttpClient client = new OkHttpClient.Builder()
  4. .authenticator(new Authenticator() {
  5. @Override
  6. public Request authenticate(Route route, Response response) throws IOException {
  7. return response.request().newBuilder().header("Authorization", basic).build();
  8. }
  9. })
  10. .build();
  11. Request request = new Request.Builder().url("http://192.168.45.2:8080/ha").build();
  12. client.newCall(request).enqueue(new Callback() {
  13. @Override
  14. public void onFailure(Call call, IOException e) {
  15. Log.d("google.sang", "onFailure: "+e.getMessage());
  16. }
  17. @Override
  18. public void onResponse(Call call, Response response) throws IOException {
  19. if (response.isSuccessful()) {
  20. Log.d("google.sang", "onResponse: "+response.body().string());
  21. }
  22. }
  23. });


  
  1. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. String header = request.getHeader("authorization");
  3. if (header != null) {
  4. String base64 = header.substring(6, header.length());
  5. byte[] bytes = Base64.decode(base64, Base64.DEFAULT);
  6. String userNameAndPasswd = new String(bytes, 0, bytes.length);
  7. if (userNameAndPasswd.equals("zhangsan:123456")) {
  8. PrintWriter out = response.getWriter();
  9. out.write("hello");
  10. System.out.println("认证成功");
  11. }else{
  12. returnError(response);
  13. }
  14. } else {
  15. returnError(response);
  16. }
  17. }
  18. private void returnError(HttpServletResponse response) throws IOException {
  19. response.setStatus(401);
  20. PrintWriter out = response.getWriter();
  21. out.write("未认证");
  22. System.out.println("认证失败");
  23. }


这里小伙伴要注意的是如果你打算使用authorization来做认证,那么服务端一定要按规范开发,就是没有认证的时候返回的错误码必须是401.


OK,这就是Authorization的简单使用,有问题欢迎留言讨论。


以上。


文章来源: wangsong.blog.csdn.net,作者:_江南一点雨,版权归原作者所有,如需转载,请联系作者。

原文链接:wangsong.blog.csdn.net/article/details/53148706

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。