安卓端调用服务器登录函数进行验证登录

  观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟。欢迎各位大佬来评论区提出问题或者是指出错误,分享宝贵经验。先谢谢了( ̄▽ ̄)"!

前面两篇算是铺垫了一下后端项目的基本工作流程,本周就讲一下前后端的简单互动——联网登录。

关于这个安卓端的项目,我个人是跟着下面链接里的教程学习的,这个登录功能算是我自己对学到的东西的一个运用,有兴趣的朋友可以去看看原文,是一个网上商城APP的范例:

  https://blog.csdn.net/sinat_17775997/article/details/79699541?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

老规矩,文中主要用到的代码会在相应位置贴出来,话不多说咱们马上进入正题!

客户端的实现:

  • XML布局:
 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".LoginActivity"> <TextView
android:id="@+id/title"
android:layout_width="350dp"
android:layout_height="wrap_content"
android:layout_marginTop="130dp"
android:layout_marginLeft="32dp"
android:text="登录"
android:textSize="36sp"
android:textStyle="bold" /> <EditText
android:id="@+id/username"
android:layout_width="350dp"
android:layout_height="wrap_content"
android:layout_below="@+id/title"
android:layout_marginLeft="28dp"
android:layout_marginTop="35dp"
android:hint="请输入用户名"
android:singleLine="true" /> <EditText
android:id="@+id/password"
android:layout_width="350dp"
android:layout_height="wrap_content"
android:layout_below="@+id/username"
android:layout_marginLeft="28dp"
android:layout_marginTop="20dp"
android:hint="请输入密码"
android:inputType="textPassword"
android:singleLine="true" /> <Button
android:id="@+id/login"
android:layout_width="350dp"
android:layout_height="wrap_content" android:layout_below="@+id/password"
android:layout_marginLeft="28dp"
android:layout_marginTop="25dp"
android:background="#E91E63"
android:text="登录"
android:textColor="#000000"
android:textSize="18sp" /> <TextView
android:id="@+id/modify"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/login"
android:layout_marginLeft="32dp"
android:layout_marginTop="15dp"
android:text="修改/忘记密码"
android:textColor="#03A9F4" /> <TextView
android:id="@+id/register"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/login"
android:layout_marginLeft="180dp"
android:layout_marginTop="15dp"
android:layout_toRightOf="@+id/modify"
android:text="注册新用户"
android:textColor="#03A9F4" /> </RelativeLayout>

activity_login.xml

  • Activity代码:
 package com.example.dolphin;

 import androidx.appcompat.app.AppCompatActivity;

 import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; import com.example.dolphin.utils.Constants;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.StringCallback; import butterknife.BindView;
import butterknife.ButterKnife;
import okhttp3.Call; public class LoginActivity extends AppCompatActivity { @BindView(R.id.username)
EditText name;
@BindView(R.id.password)
EditText key;
@BindView(R.id.login)
Button login; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
ButterKnife.bind(this);
login.setOnClickListener(view->
new Thread(()->getDataFromNet()).start()
);
}
private void getDataFromNet() {
String url = Constants.LOGIN_URL;
OkHttpUtils
.get()
.url(url)
.addParams("name",name.getText().toString())
.addParams("key",key.getText().toString())
.build()
.execute(new StringCallback()
{
/**
* 请求失败的时候回调
* @param call
* @param e
* @param id
*/
@Override
public void onError(Call call, Exception e, int id) {
System.out.println("首页请求失败=="+e.getMessage());
}
/**
* 当请求成功的时候回调
* @param response 请求成功数据
* @param id
*/
@Override
public void onResponse(String response, int id) {
System.out.println("首页请求成功=="+response);
//解析数据
processData(response);
}
});
} private void processData(String json) {
System.out.println(json);
if(json.equals("YES")){
Toast.makeText(this,"登陆成功",Toast.LENGTH_SHORT).show();
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
}else
Toast.makeText(this,"用户名或者密码错误",Toast.LENGTH_SHORT).show();
}
}

LoginActivity.java

  这里用到了鸿洋大神封装好的 okhttp3 以及插件ButterKnife(黄油刀),其主要功能分别如下:

  okhttp-utils(目前对以下需求进行了封装):

  • 一般的get请求
  • 一般的post请求
  • 基于Http Post的文件上传(类似表单)
  • 文件下载/加载图片
  • 发布下载的进度预期
  • 支持取消某个请求
  • 支持自定义回调
  • 支持HEAD,DELETE,PATCH,PUT
  • 支持会议的保持
  • 支持自签名网站https的访问,提供方法设置下证书就行

  如何引入依赖以及详细介绍请移步到这位大神的Github:https://github.com/hongyangAndroid/okhttputils

  ButterKnife(黄油刀):

  ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤。是大神JakeWharton的力作,目前使用很广。最重要的一点,使用ButterKnife对性能基本没有损失,因为ButterKnife用到的注解并不是在运行时反射的,而是在编译的时候生成新的class。项目集成起来也是特别方便,使用起来也是特别简单。

  使用与配置方法总结见这里:https://www.cnblogs.com/chenxibobo/p/9633086.html

  还有就是为了避免每次进行get或者post请求时都会填写很长的url地址,我新建了一个公共类保存这些静态变量,如下图:

  同时记得把地址和端口号填写正确,而且确保要访问的服务器正在运行,不然会出现如下错误提示(写在代码里了):

WEB端的实现:

  • LoginController(登录控制层)
 package dolphin.controller;

 import dolphin.service.UserService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import dolphin.utils.Singleton;
import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; /**
* 登录控制层
* @author 郭小柒w
* @date 2020/3/25 21:18
*/
@Controller
public class LoginController {
private UserService userService = (UserService) Singleton.GetApplicationContext().getBean("UserServiceImpl");
/**
* @Description :登陆验证
* @return :java.lang.String
**/
@ResponseBody
@RequestMapping("/Login")
public String check(HttpServletRequest request){
//获取请求中的参数,用户名和密码
String name = request.getParameter("name");
String key = request.getParameter("key");
//返回验证结果
return userService.isLoginOk(name,key) ? "YES" : "NO";
}
}

LoginController.java

  • isLoginOk(登录函数)
 public boolean isLoginOk(String username, String password){
//这里使用了最简单粗暴的方法,获取全部用户信息后再逐个进行对比
List<UserEntity> list = getAll();
for (UserEntity arr:list) {
if(username.equals(arr.getUserName())&&password.equals(arr.getUserKey()))
return true;
}
return false;
}

isLoginOk.java

  这个登录验证函数是在UserDaoImpl里实现的(具体代码见本系列第二篇),供Service调用,最终由LoginController接受客户端的请求并提供相应功能。这里对于验证结果的返回没有做复杂的处理,只是简单地返回了字符串“YES”或“NO”,供客户端进行判断。运行效果如下(用户名:fffvv,密码:122211,为本系列第二篇中新增的用户):

密码错误示意图

密码正确示意图

  好了,至此一个简单的登录模块已经完成了。你也可以尝试使用安卓的SharedPerferences对用户的信息进行保存,避免每次都需要用户登录。本期的介绍到这里也就差不多了。如果你对代码中的某些部分有疑问,欢迎在评论区里指出,我会在空闲时间尽快进行回复。

—————————我———是———分———割———线—————————

  废话来啦!

  本来是要打算周五正常更新的,不过上午突然接到了个老师的通知,大概内容是我们组马上要对方案设计进行线上答辩了,PPT也要进行改动。想了想这周还有一个计网实验报告没写,最近打卡变捞也想得到提升,就早早把这篇文章赶出来了,本周五的更新就算是提前了吧,昨天真不该毒奶的。。。

如何搭建一个WEB服务器项目(三)—— 实现安卓端联网登录的更多相关文章

  1. 如何搭建一个WEB服务器项目(二)—— 对数据库表进行基本的增删改查操作

    使用HibernateTemplate进行增删改查操作 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟.欢迎各位大佬来评论区提出问题或者是指出 ...

  2. 如何搭建一个WEB服务器项目(六)—— 上传图片至服务器

    上传图片(用户头像)至服务器 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟.欢迎各位大佬来评论区提出问题或者是指出错误,分享宝贵经验.先谢谢 ...

  3. 如何搭建一个WEB服务器项目(四)—— 实现安卓端图片加载

    使用Glide安卓图片加载库 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟.欢迎各位大佬来评论区提出问题或者是指出错误,分享宝贵经验.先谢谢 ...

  4. 如何搭建一个WEB服务器项目(一)—— 开篇 ,搭建SSH整合框架

    使用Intellij IDEA2019创建SSH(Spring+SpringMVC+Hibernate+Maven整合)项目 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解, ...

  5. 如何搭建一个WEB服务器项目(五)—— Controller返回JSON字符串

    从服务器获取所需数据(JSON格式) 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟.欢迎各位大佬来评论区提出问题或者是指出错误,分享宝贵经验 ...

  6. 搭建一个Web API项目(DDD)

    传送阵:写在最后 一.创建一个能跑的起来的Web API项目 1.建一个空的 ASP.NET Web应用 (为什么不直接添加一个Web API项目呢,那样会有些多余的内容(如js.css.Areas等 ...

  7. 用C写一个web服务器(三) Linux下用GCC进行项目编译

    .container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px } .conta ...

  8. django uWSGI nginx搭建一个web服务器 确定可用

    网上的找了很多篇 不知道为什么不行,于是自己搭建了一个可用的Web 大家可按步骤尝试 总结下基于uwsgi+Nginx下django项目生产环境的部署 准备条件: .确保有一个能够用runserver ...

  9. express搭建一个web服务器

    npm install express -g                           express这个库可以使用了. npm install express-generator -g   ...

随机推荐

  1. 【山外笔记-云原生】《Docker+Kubernetes应用开发与快速上云》读书笔记-2020.04.25(六)

    书名:Docker+Kubernetes应用开发与快速上云 作者:李文强 出版社:机械工业出版社 出版时间:2020-01 ISBN:9787111643012 [山外笔记-云原生]<Docke ...

  2. 如何使用IE9浏览器自带开发人员工具捕获网页请求

    我们在通过浏览器访问一个网页的时候,有时候会遇到页面不能正常显示,图片不能正常加载的问题. 如果我们需要知道浏览器打开该网页时,网页中每个元素的加载情况.这时,我们便可以借助浏览器自带开发人员工具,来 ...

  3. 关于MySQL数据库存储过程的感想

    以下只是学习路上的浅薄感想,如理解有所偏差,还请有识之士指正! 一.存储过程意义理解 关于存储过程,我的理解是对数据库语言进行编程调用,就像Java代码类编程写一个具有某种特定功能的方法去进行调用一样 ...

  4. php class 访问控制

    属性(attribute ) 必须声明访问控制类型 类型: public 公用 protected 受保护的 private  私有的 public 类型的属性 可以在外部访问 protected 及 ...

  5. NC使用练习之通达OA-2017版本漏洞复现后续

    利用上一篇通达OA的漏洞环境,练习NC工具的使用. 步骤: 1.本机启动nc.exe监听端口: 确认端口是否成功监听成功: 2.用冰蝎将nc.exe上传至目标机: 3.用命令行在目标机启动nc.exe ...

  6. windows server 2012 R2系统安装部署SQLserver2016企业版(转)

    转自  https://blog.csdn.net/qq_35938548/article/details/80272288 安装sql server是一个很繁琐的事情,花了一下午时间倒腾,现记录下整 ...

  7. c++库 c语言接口

    //code in add.cxx #include "add.h" int sample::method() { cout<<"method is call ...

  8. QML-AES加解密小工具

    Intro 为了解码网课视频做的小工具,QML初学者可以参考一下. 项目地址 Todo 在插入新条目时,ListView不会自动根据section进行重排,因此出现同一个文件夹重复多次的现象.目测强行 ...

  9. Java演示设计模式中的写代码的代码

    下边代码内容是关于Java演示设计模式中的单件模式的代码,应该是对小伙伴们有所用处. public class SimpleSingleton { private static SimpleSingl ...

  10. 搭建Springboot+mybatis+redis+druid

    2019独角兽企业重金招聘Python工程师标准>>> 准备工作 JDK:1.8 使用技术:SpringBoot.Dubbo.Mybatis.Druid 开发工具:Intelj ID ...