如何搭建一个WEB服务器项目(三)—— 实现安卓端联网登录
安卓端调用服务器登录函数进行验证登录
观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟。欢迎各位大佬来评论区提出问题或者是指出错误,分享宝贵经验。先谢谢了( ̄▽ ̄)"!
前面两篇算是铺垫了一下后端项目的基本工作流程,本周就讲一下前后端的简单互动——联网登录。
关于这个安卓端的项目,我个人是跟着下面链接里的教程学习的,这个登录功能算是我自己对学到的东西的一个运用,有兴趣的朋友可以去看看原文,是一个网上商城APP的范例:
老规矩,文中主要用到的代码会在相应位置贴出来,话不多说咱们马上进入正题!
客户端的实现:
- 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服务器项目(三)—— 实现安卓端联网登录的更多相关文章
- 如何搭建一个WEB服务器项目(二)—— 对数据库表进行基本的增删改查操作
使用HibernateTemplate进行增删改查操作 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟.欢迎各位大佬来评论区提出问题或者是指出 ...
- 如何搭建一个WEB服务器项目(六)—— 上传图片至服务器
上传图片(用户头像)至服务器 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟.欢迎各位大佬来评论区提出问题或者是指出错误,分享宝贵经验.先谢谢 ...
- 如何搭建一个WEB服务器项目(四)—— 实现安卓端图片加载
使用Glide安卓图片加载库 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟.欢迎各位大佬来评论区提出问题或者是指出错误,分享宝贵经验.先谢谢 ...
- 如何搭建一个WEB服务器项目(一)—— 开篇 ,搭建SSH整合框架
使用Intellij IDEA2019创建SSH(Spring+SpringMVC+Hibernate+Maven整合)项目 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解, ...
- 如何搭建一个WEB服务器项目(五)—— Controller返回JSON字符串
从服务器获取所需数据(JSON格式) 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟.欢迎各位大佬来评论区提出问题或者是指出错误,分享宝贵经验 ...
- 搭建一个Web API项目(DDD)
传送阵:写在最后 一.创建一个能跑的起来的Web API项目 1.建一个空的 ASP.NET Web应用 (为什么不直接添加一个Web API项目呢,那样会有些多余的内容(如js.css.Areas等 ...
- 用C写一个web服务器(三) Linux下用GCC进行项目编译
.container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px } .conta ...
- django uWSGI nginx搭建一个web服务器 确定可用
网上的找了很多篇 不知道为什么不行,于是自己搭建了一个可用的Web 大家可按步骤尝试 总结下基于uwsgi+Nginx下django项目生产环境的部署 准备条件: .确保有一个能够用runserver ...
- express搭建一个web服务器
npm install express -g express这个库可以使用了. npm install express-generator -g ...
随机推荐
- Unity 芯片拼图算法
很多游戏的养成系统中会有利用芯片或者碎片来合成特定道具的功能,或者来给玩家以额外的属性提升等,先截个图以便更好说明: 如上图,我们有各种各样形状迥异的碎片,上面只不过列举了其中一部分,现在,我们需要利 ...
- AWR发现TOP Event log file sequential read
对客户DB进行巡检,发现TOP EVENT是LOG FILE Sequential read 等待事件说明 https://www.xuebuyuan.com/zh-hant/1743045.html ...
- <string>头文件常用成员函数
之前说过 string和vector一样,也是一种顺序容器,并且它也自带成员函数,用法和vector的成员函数差不多,不过它只能用来存放字符,也就是字符串. 在c++中,<string>基 ...
- ajaxReturn案例
请查看:http://www.cnblogs.com/bushe/p/4625097.html 不用自己写json格式啦,直接拿这个用就可以啦
- 接近8000字的Spring/SpringBoot常用注解总结!安排!
0.前言 大家好,我是 Guide 哥!这是我的 221 篇优质原创文章.如需转载,请在文首注明地址,蟹蟹! 本文已经收录进我的 75K Star 的 Java 开源项目 JavaGuide:http ...
- Docker 部署 halo 启动时,MySql 连接不上
原因 halo 是部署在 docker 容器内部的,而 MySql 是部署在"宿主机"上的,docker默认的网络模式是bridge,容器内127.0.0.1访问不到的,把网络模式 ...
- java中wait和sleep的区别
文章目录 Wait和sleep的区别 唤醒wait和sleep java中wait和sleep的区别 在本篇文章中,我们将会讨论一下java中wait()和sleep()方法的区别.并讨论一下怎么使用 ...
- Eureka重点原理解析
前言 带着问题学习,事半功倍.本文将对如下几个问题进行总结说明: 1.EurekaServer端服务注册的流程和设计模式 2.Eureka服务续约的bug 3.EurekaClient的启动流程 4. ...
- 一只简单的网络爬虫(基于linux C/C++)————配置文件设计及读取
一般来说linux下比较大型的程序都是以配置文件作为参数介质传递的,该爬虫也采用配置文件的方式来获取参数,配置文件格式大致如下: max_job_num=1 #seeds=https://www.ba ...
- Codeforces Round #637 (Div. 2) 题解
A. Nastya and Rice 网址:https://codeforces.com/contest/1341/problem/A Nastya just made a huge mistake ...