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

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

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

关于这个安卓端的项目,我个人是跟着下面链接里的教程学习的,这个登录功能算是我自己对学到的东西的一个运用,有兴趣的朋友可以去看看原文,是一个网上商城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. py安装教程

    https://www.runoob.com/w3cnote/pycharm-windows-install.html

  2. java并发中的Synchronized关键词

    文章目录 为什么要同步 Synchronized关键词 Synchronized Instance Methods Synchronized Static Methods Synchronized B ...

  3. NFS共享设置

    一.安装所需要的软件环境[root@fengling ~]# yum -y install rpcbind nfs-utils二.创建共享目录mkdir /web三.启动服务[root@fenglin ...

  4. css之单位

    css之单位 角度<angle> 用于<gradient>s和某些transform功能中 deg表示以度为单位的角度.一整圈就是360deg. 例如:0deg,90deg,1 ...

  5. 基于java的OpenCV安装和配置

    目录 OpenCV简介 OpenCV下载安装 eclipse里引用jar包和配置 OpenCV简介 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Window ...

  6. wampserver安装之后无法打开localhost

    2019独角兽企业重金招聘Python工程师标准>>> 如上图 是服务未成功启动 服务成功启动标志 修改服务器监听端口 在安装完wampserver,打开,如果在状态栏上的图标不是绿 ...

  7. 我对sessionid的理解

    不知道是不是扯蛋,还是太菜... 看上面的的话毫不关系是吧...自己看过一点 关于 说session id 的 一些文章, 貌似都是一样的....以下内容个人理解, 请大家指正... 我想自己举个例子 ...

  8. 图论--边双连通V-DCC缩点

    // tarjan算法求无向图的割点.点双连通分量并缩点 #include<iostream> #include<cstdio> #include<cstring> ...

  9. P2480 [SDOI2010]古代猪文

    P2480 [SDOI2010]古代猪文 比较综合的一题 前置:Lucas 定理,crt 求的是: \[g^x\bmod 999911659,\text{其中}x=\sum_{d\mid n}\tbi ...

  10. 一只简单的网络爬虫(基于linux C/C++)————守护进程

    守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程常常在系统引导装入时启动, ...