如何搭建一个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 ...
随机推荐
- java 多线--静态代理模式
我们使用 java 多线程时,都需要通过线程代理对象来启动线程,常见的写法: new Thread(target).start(); 这在设计模式中叫静态代理模式,静态代理模式组成; 1.公共接口 2 ...
- Caused by:java.lang.ClassNotFoundException:org.apache.hadoop.yarn.util.Apps
错误原因 缺少hadoop-yarn.jar包. 导入jar包就好了~-~
- 13206抢票代码 py
抢票代码 https://github.com/Bingshuli/12306Python 谷歌驱动 http://chromedriver.storage.googleapis.com/index. ...
- 【Linux题目】第七关
1. 如果想修改开机内核参数,应该修改哪个文件? A. /dev/sda1 B. /etc/fstab 磁盘自动挂载的文件 C. /boot/grub/grub.conf D. /etc/rc.loc ...
- Vue-cli3.0下的雪碧图插件webpack-spritesmith配置方法
在前端项目中,为了减少对图片的请求次数,一般而言需要进行雪碧图的配置.即将多张小图标合并成一张图片,这样页面中的小图标都在一张图片上,只需请求一张图片,就可以通过CSS设置各个小图标的显示,利于节省带 ...
- dhcpd.conf(5) - Linux man page
http://linux.die.net/man/5/dhcpd.conf Name dhcpd.conf - dhcpd configuration file Description The d ...
- Express 文档(常见问题)
常见问题 我该如何构建我的应用程序? 这个问题没有明确的答案,答案取决于你的应用程序规模和所涉及的团队,为了尽可能灵活,Express在结构方面没有做出任何假设. 在你喜欢的任何目录结构中,路由和其他 ...
- iOS架构入门 - MVC模式实例演示
MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能.除此之外,此模式通过对复杂度的简化,使程序结构更加直观 控制器(Controller)-- ...
- matlab画图(一)
例1.画出函数图像 >> x=-pi/2:0.01:pi/2; >> y=x+sin(x)+exp(x); >> plot(x,y,'r','Linewidth', ...
- JeeSite 4.0 简化业务逻辑层开发
2019独角兽企业重金招聘Python工程师标准>>> 引言 对于业务逻辑层的开发重复代码很多,尽管有代码生成器,但从代码量总的来说还是比较多,所以就有了以下抽象类及工具,对一些常用 ...