iOS学习笔记-142.网络02——自己搭建的后台登陆接口分析
程序员文章站
2024-01-04 22:23:40
自己搭建的后台登陆接口分析
一、说明
我们其实是使用 servlet 来搭建我们的登陆接口的。使用的开发工具是 IDEA。
当请求我们的登陆接口的时候,如下:
1.请求来到...
自己搭建的后台登陆接口分析
一、说明
我们其实是使用 servlet 来搭建我们的登陆接口的。使用的开发工具是 IDEA。
当请求我们的登陆接口的时候,如下:
1.请求来到过滤器上,过滤器会判断当前的请求是否携带了客户端类型,如果没有携带,获取没有满足,那么直接给请求方让其添加客户端类型,请求结束。
2.如果通过了上面的第1步骤,那么就到了登陆接口,到了以后判断用户名、密码是否正确,不正确返回错误信息,正确放回登陆信息。
通过上面我们主要涉及到 过滤器 和 登陆接口的 Servlet。其他也有很多,我们来重点看一下这两个就行。
那么首先应该从配置文件看起。
二、web.xml
ChartFilter com.qwm.iostestapi.filter.ChartFilter ChartFilter /* LoginServlet com.qwm.iostestapi.servlet.LoginServlet LoginServlet /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. 创建响应的实体类 BaseResponseBeanbaseResponseBean = 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); } }