【编程新实务】Lab4 系统登录/注册模块(Android app)的开发

Github仓库

客户端+服务端
客户端开发环境:Android studio(API 21)
服务端开发环境:IDEA(JDK15+Mysql8.0+tomcat8.5.59)

前言

本次是本学期编程新实务最后一次实验,四次实验不断迭代最后总能得到一个属于自己的东西。
之前也没接触过java,这门课啥都是从0开始基本上。也参考了很多学长的博客和很多大佬的博客!
由于之前Lab2已经实现部署到云服务器,因此本次实验相对省心不少。我在Lab2的基础上修改了servlet实现后端传输一个json数据给安卓客户端解析,大多数工作交给了后端完成,传回安卓客户端实际就一个操作结果。比如注册成功/失败,修改密码成功/失败,登录成功/失败(此处多返回name,username,age,telephone等数据),由于一直在前面实验基础上迭代,因此数据库表都懒得改了!!!

具体影响比如:
密码只能八位,username11位,name11位都是实验一留下的东西,懒得改了。
然后我把实验一中person表中主键由原来的name改为username,这样整个安卓登录注册,唯一不能重复的就是username了,我觉得这样更符合实际一点。

完后还加了一个mob平台的短信验证,没别的原因,主要免费!!!

传送门(本人的):
实验一,java编程操作数据库
实验二,servlet+jsp实现javaweb数据库操作
实验二部署到云服务器
参考的博客:
mob平台使用
阿里图标库超级全

展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

安卓前端

此部分主要是实现UI的编码
安卓实现UI一般有4种方式,纯xml布局文件,在java代码中控制UI,java+xml,自定义view
一般的话都是xml加java代码,xml实现页面布局相对直观
java代码实现交互,如button按钮,edittext的内容合法性判断。
而xml一般使用4种布局管理器,相对布局,帧布局,线性布局,网格布局。

更多基础知识请移步这儿补:
安卓从入门到入土
登录:

在这里插入图片描述
忘记密码:
在这里插入图片描述
注册:
在这里插入图片描述
欢迎:
在这里插入图片描述

代码稍后上传Github

安卓后端

登录和注册主要用到
AsyncTask实现一个异步通信多线程
一个xml布局文件对应一个java类
例如:mainactivity代码如下:

package com.example.client;

import androidx.appcompat.app.AppCompatActivity;
import android.os.AsyncTask;
import  android.widget.Button;
import android.os.Bundle;
import android.view.*;
import android.content.*;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import org.json.JSONObject;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class MainActivity extends AppCompatActivity {
    private EditText username;
    private EditText password;
    private TextView err;
    private Button b1;//注册按钮
    private Button b2;//登录按钮
    private Button b3;//忘记密码按钮
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        username = (EditText) findViewById(R.id.username);
        password = (EditText) findViewById(R.id.password);
        err = (TextView) findViewById(R.id.message);
        b1 = (Button) findViewById(R.id.register);
        b2 = (Button) findViewById(R.id.login);
        b3 = (Button) findViewById(R.id.login_error);
    }

    public void sign(View view) {    //登录按键的响应按键
        String user = username.getText().toString();
        String pass = password.getText().toString();
        if (user.isEmpty() || pass.isEmpty()) {
            err.setText("登录失败,用户名或密码不能为空");
            err.setVisibility(View.VISIBLE);
        } else {
            err.setText(null);
            err.setVisibility(View.INVISIBLE);
            new SignInProcess().execute(user,pass);
        }
    }

    public void signUp(View view) {   //注册按键的响应按键
        Intent intent = new Intent(MainActivity.this, RegisterActivity.class);
        startActivity(intent);
    }

    public void forget(View view) {   //注册按键的响应按键
        Intent intent = new Intent(MainActivity.this, ChangepassActivity.class);
        startActivity(intent);
    }

    private class SignInProcess extends AsyncTask<String, String, String> {
        @Override
        protected String doInBackground(String... params) {
            String username = params[0];
            String password = params[1];
            String result = "";
            String s_url = "http://loaclhost:8080/lab4/Sign?username="+username+"&password="+password;
            //localhost处是自己部署服务器的IP地址,物理机测试换自己IP也行,它默认解析localhost可能会出错!
            System.out.println(s_url);
            try {
                URL url = new URL(s_url);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                conn.setUseCaches(false);
                conn.connect();
                InputStream is = conn.getInputStream();
                InputStreamReader reader = new InputStreamReader(is, "UTF-8");//获取服务器数据实现从字节流到字符流转换
                int temp;
                while((temp=reader.read()) != -1) {
                    result += (char)temp;
                }
            } catch(Exception e) {
                err.setText("登录失败,网络错误");
                err.setVisibility(View.VISIBLE);
                e.printStackTrace();
            }
            System.out.println(result);
            return result;
        }

        @Override
        protected void onPostExecute(String result) {
            try {
                JSONObject result_json = new JSONObject(result);
                if(result_json.has("error")) {
                    String error_code;
                    error_code = result_json.getString("error");
                    err.setText(error_code);
                    err.setVisibility(View.VISIBLE);
                    password.setText(null);
                } else {
                    SignInSuccess(result_json);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

    private void SignInSuccess(JSONObject info) {
        Intent intent=new Intent();
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setClass(this,WelcomeActivity.class);

        Toast.makeText(this,"登录成功",Toast.LENGTH_SHORT).show();
        try {
            intent.putExtra("username", info.getString("username"));
            intent.putExtra("name", info.getString("name"));
            intent.putExtra("age", info.getString("age"));
            intent.putExtra("teleno", info.getString("teleno"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        startActivity(intent);
    }
}

主要通过HttpURLConnection实现与服务器后端通信,由于实验二搞的不是很严谨,没有用https通信,调用servlet是明文,密码会被抓包直接得到。。。等后续有空再完善!!!

服务器后端

以登录为例子:

package Servlet;

import net.sf.json.JSON;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import lab2.*;

//注册接口

/**
 * Servlet implementation class Sign
 */
@WebServlet("/Sign")
public class Sign extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public Sign() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.setContentType("text/html;charset=UTF-8");
        String username = request.getParameter("username").trim();
        String password = request.getParameter("password").trim();
        PrintWriter out = response.getWriter();
        UserOp uo = new UserOp();
        PersonOp po = new PersonOp();
        DB_conn_op sjk = null;
        try {
            sjk = new DB_conn_op();
        } catch (Exception e) {
            e.printStackTrace();
        }
        JSONObject res = new JSONObject();
        boolean flag = false;//username是否存在
        try {
            flag = uo.findUser1(new User(username,password),sjk);
            if(flag){//如果找到user
                Person p = po.findPerson1(username,sjk);
                res.put("username",p.getUsername());
                res.put("name",p.getName());
                if(p.getAge()!=null)
                res.put("age",p.getAge().toString());
                else res.put("age","");
                if(p.getTeleno()!=null)
                res.put("teleno",p.getTeleno());
                else res.put("teleno","");
            }
            else res.put("error","登陆失败,用户名或密码错误");

        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(res);
        out.println(res);
        out.close();
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

补充:

数据库被盗之后,服务器重装系统为CentOs8.0了,并从新部署了一遍,并且数据库存密码那一项改成了密文存储,java包直接可以调用MD5加密算法进行加密存储。

总结

这门课似乎学到了很多东西!!!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值