上一节我们说了如何创建一个ios客户端,cocoapods的安装以及AFNetworking的使用,并且通过网络连接服务器,实现json的数据返回。我们发现,更加前几节服务器端的开发,登陆功能只是简单的查询一下数据库有没有这个账号和密码。我们需要对服务器的代码优化一下。
知识准备
server端:
服务器的登陆模块增加邮箱验证和密码检测,状态码需要增加一下。
下面开始今天的课程:
服务器端:
我们知道,服务器端是直接对输入的邮箱和密码进行数据库查询的,没有进行任何的处理,这样处理可能会存在一些非法字段。尽管可能我们客户端也做了检查,但是防止第三方的修改来访问,所以还是需要对服务器端进行处理。并且根据不同的处理返回不同的状态。我们需要作如下的判断,并且我们定义了如下的几个状态,用于返回给客户端。我们这里直接通过代码来处理。
1、字符为空的判断,为空的话,返回状态:10001
2、邮箱的验证,非法邮箱的话,返回状态:10002
3、密码的长度验证,密码长度不够的话,返回状态:10003
4、是否存在此用户,不存在此用户的话,返回状态:10004
5、密码检验,如果密码不正确,返回状态:10005
了解如上的规则后,我们需要对服务器的代码进行修改。
首先是判断字符串为空的情况,这个处理起来比较简单。如果是空返回true,否则返回false
//判断字符串是否为空
private static boolean StringIsNull(String info) {
if (info==null) {
returntrue;
}
else {
returnfalse;
}
}
接着邮箱的验证,这里我们可以使用正则表达式来处理。对于正则表达式其实就是根据我们的命名的规则,然后检查我们所包含的特殊字符。
比如我们的邮箱,肯定是存在"@"字符的,那么@字符前面肯定是用字母或者是数字表示的,@后面也是字符或者字母表示的,肯定是有“.”的并且"."后面是字母或者数字。
所以我们可以这样用正则表达式来验证
//判断email是否符合规则
private static boolean isEmail(String email) {
Pattern pattern = Pattern.compile("^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$");
Matcher matcher = pattern.matcher(email);
return matcher.matches();
}
对于我们的登陆系统,可能还会用到的是手机号码验证。
验证电话号码:"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"
密码长度的检查:
有时我们系统为了安全,需要对密码的位数进行处理,防止被攻破的现象,要求用户至少输入六位数以上的密码。那么如何对密码的位数进行处理
我们直接通过对密码的长度检测,如果是大于六就返回true.否则返回false,当然我们要求密码是全英文或者数字的。这样才可以通过位数检测,因为一个字母或者数字的位数是一位的。
//检测密码长度超过6
public static boolean passwdisok(String passwd) {
if (passwd.length()<6) {
returnfalse;
}
else {
returntrue;
}
}
这里说一下,有时我们系统还会要求密码至少是存在一位是大写的并且存在字母和数字,那么我们可以对数据进行三次判断,首先判断是否存在小写,"[a-z]+",然后判断是否存在大写"[A-Z]+",再判断是否存在数字"[0-9]+"就可以了。
判断是否存在此用户
我们在服务器端的业务逻辑层和数据访问层写一个检查邮箱是否存在的方法,
//如果存在此邮箱的话,返回true,否则返回false
@Override
public boolean haveEmail(String email) {
// TODO Auto-generated method stub
Session session = this.getSession();
String hql = "from YeehotUser where email =:email ";
Query query = session.createQuery(hql);
query.setParameter("email",email );
if (query.list().size() >= 1) {
returntrue;
}
returnfalse;
}
密码的检验,
对于密码的检查,我们可以首先根据是否存在邮箱,如果存在的话,那么根据我们上一节的检查数据库是否有邮箱和密码就可以判断密码是否正确了。因为邮箱已经正确了。所以根据密码的查找就知道。
根据上面的几个简单的分析,
那么我们这里需要对服务器的LoginController进行修改。完整的代码如下,
public class LoginController {
@Resource
private IUserService userService;
@RequestMapping(value="/login", method=RequestMethod.GET, produces = "text/html;charset=UTF-8")
@ResponseBody
public String showUserInfo( String email, String passwd){
System.out.println(email+",,"+passwd);
JSONObject jsonObject=new JSONObject();
if (Utils.StringIsNull(email)||Utils.StringIsNull(passwd)) {
jsonObject.put("status", 10001);
jsonObject.put("des", "邮箱或密码不能为空");
}
else if (Utils.isEmail(email)==false) {
jsonObject.put("status", 10002);
jsonObject.put("des", "请输入正确的邮箱");
}
else if (Utils.passwdisok(passwd)==false) {
jsonObject.put("status", 10003);
jsonObject.put("des", "请输入六位以上的密码");
}
else if (userService.haveEmail(email)==false) {
jsonObject.put("status", 10004);
jsonObject.put("des", "不存在此用户");
}
else if (userService.iscanlogin(email, passwd)==false) {
jsonObject.put("status", 10005);
jsonObject.put("des", "密码不正确");
}
else {
jsonObject.put("status", 10000);
jsonObject.put("des", "登陆成功");
}
return jsonObject.toJSONString();
}
}
注意:由于我这里在手机上设计是无状态登陆的,所以我们在服务器端不进行session记录。
最后效果运行如下:
当然,登陆部分还涉及到很多的功能没有一一罗列出来,比如加密,在客户端,我们的密码是明文传输的,所以我们需要在需要对密码进行MD5加密一下。至于在服务端加密还是客户端加密就看大家如何考虑了。此外还可以对称加密的方式
这一节就讲到这里,下一节我们继续讲解我们的注册功能模块
大家可以关注我的头条号:一点热
未经同意,不得转载。
本文暂时没有评论,来添加一个吧(●'◡'●)