欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS学习笔记-142.网络02——自己搭建的后台登陆接口分析

程序员文章站 2022-03-16 16:23:16
自己搭建的后台登陆接口分析 一、说明 我们其实是使用 servlet 来搭建我们的登陆接口的。使用的开发工具是 IDEA。 当请求我们的登陆接口的时候,如下: 1.请求来到...

自己搭建的后台登陆接口分析

一、说明

我们其实是使用 servlet 来搭建我们的登陆接口的。使用的开发工具是 IDEA。

当请求我们的登陆接口的时候,如下:

1.请求来到过滤器上,过滤器会判断当前的请求是否携带了客户端类型,如果没有携带,获取没有满足,那么直接给请求方让其添加客户端类型,请求结束。

2.如果通过了上面的第1步骤,那么就到了登陆接口,到了以后判断用户名、密码是否正确,不正确返回错误信息,正确放回登陆信息。

通过上面我们主要涉及到 过滤器 和 登陆接口的 Servlet。其他也有很多,我们来重点看一下这两个就行。

那么首先应该从配置文件看起。


二、web.xml


ChartFiltercom.qwm.iostestapi.filter.ChartFilterChartFilter/*LoginServletcom.qwm.iostestapi.servlet.LoginServletLoginServlet/login

从上面,可以看到我们的过滤器是,全部请求的过滤的。上面配置了我们的登陆接口的 URI 是 “/login”


三、ChartFilter过滤器

package com.qwm.iostestapi.filter;

import com.google.gson.Gson;
import com.qwm.iostestapi.response.BaseResponseBean;
import com.qwm.iostestapi.response.ResponseStatusCode;
import com.qwm.iostestapi.utils.TextUtils;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

import static com.qwm.iostestapi.response.ResponseStatusCode.*;

/**
 * @author: wiming
 * @date: 2017-09-11 13:49:21  星期一
 * @decription: 字符过滤器,目的就是为了让所有的请求和响应都是 UTF-8
 *   还有判断我们的地址是否符合要求,是否携带了 客户端类型(1:安卓 2:iOS)
 */
public class ChartFilter implements Filter {

    public void init(FilterConfig config) throws ServletException {

    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException,
            IOException {

        //1. 转换请求、响应对象
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

        //2. 设置编码
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/json;charset=utf-8");

        //2. 判断一下你是不是直接请求我们的域名,后面什么都没,这样这个直接给你不给你资源,不要问我为什么,我就这么吊
        String uri = request.getRequestURI().replaceAll("/+","/");
        System.out.println(uri);
        if("".equals(uri) || "/".equals(uri)){
            BaseResponseBean responseBean = new BaseResponseBean();
            responseBean.setStatusCode(ResponseStatusCode.URI_NULL);
            String json = new Gson().toJson(responseBean);
            response.getWriter().write(json);
            return;
        }

        //3. 从请求头上获取到我们的客户端,客户端类型(1:安卓 2:iOS)
        String clientType = request.getHeader("QWM-CLIENT-TYPE");
        ResponseStatusCode statusCode = OK;
        if (TextUtils.isEmpty(clientType)) {//没有传递客户端而类型,那么不让通过,告诉用户需要传递客户端类型
            statusCode = CLIENT_TYPE_NULL;
        } else if (!"1".equals(clientType) && !"2".equals(clientType)) {
            statusCode = CLIENT_TYPE_ERROR;;
        }

        if(statusCode!=OK){//返回
            BaseResponseBean responseBean = new BaseResponseBean();
            responseBean.setStatusCode(statusCode);
            String json = new Gson().toJson(responseBean);
            response.getWriter().write(json);
            return;
        }
        chain.doFilter(request, response);
    }

    public void destroy() {
    }

}

四、LoginServlet登陆

我们的登陆接口 POST,GET都是可以的,处理流程见代码。

package com.qwm.iostestapi.servlet;

import com.google.gson.Gson;
import com.qwm.iostestapi.response.BaseResponseBean;
import com.qwm.iostestapi.response.LoginResponseBean;
import com.qwm.iostestapi.response.ResponseStatusCode;
import com.qwm.iostestapi.utils.Md5Utils;
import com.qwm.iostestapi.utils.TextUtils;

import java.io.IOException;

import static com.qwm.iostestapi.response.ResponseStatusCode.*;

/**
 * @author: wiming
 * @date: 2017-09-11 12:53:46  星期一
 * @decription: 模拟登录接口
 */
public class LoginServlet extends javax.servlet.http.HttpServlet {

    /**
     * 用户名
     */
    private String mUserName = "qiwenming";
    /**
     * 密码 123456 的二次 MD5 值
     */
    private String mPassword = "14e1b600b1fd579f47433b88e8d85291";

    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        //1.获取参数
        String username = request.getParameter("userName");
        String pwd = request.getParameter("password");
        String clientType = request.getHeader("QWM-CLIENT-TYPE");

        //2. 创建响应的状态的枚举
        ResponseStatusCode requstStatus = SERIVE_ERROR;

        //3. 创建响应的实体类
        BaseResponseBean baseResponseBean = new BaseResponseBean<>();

        //4. 判断
        if( TextUtils.isEmpty(username) ){
            requstStatus = LOGIN_ACCOUNT_NULL;
        }else if( TextUtils.isEmpty(pwd) ){
            requstStatus = LOGIN_PASSWORD_NULL;
        }else if( !mUserName.equals(username) ){
            requstStatus = LOGIN_ACCOUNT_ERROR;
        }else if( !mPassword.equals(Md5Utils.md5Encode(pwd.toLowerCase())) ){//屏蔽大小写产生的影响
            requstStatus = LOGIN_PASSWORD_ERROR;
        }else{
            requstStatus = OK;
            requstStatus.setDesc("登录成功");
            //创建登录信息的实体类
            LoginResponseBean loginResp = new LoginResponseBean();
            loginResp.userName = mUserName;
            loginResp.clientType = clientType;
            baseResponseBean.t = loginResp;
        }

        // 5. 设置返回的状态码
        baseResponseBean.code = requstStatus.getCode();
        baseResponseBean.msg = requstStatus.getDesc();

        //6. 对象转为json
        String json = new Gson().toJson(baseResponseBean);

        System.out.println(json);

        //7. 返回Gson
        response.getWriter().write(json);
    }
}