JavaWeb实现好友验证的思路

需求分析:大家在一些网站注册账号的时候,有时会忘记密码或者账号被盗,正规的网站都是通过手机发验证码的,这可能要调用第三方来实现。因为我是自己做的小项目,这是想有这么个验证的流程,所以我这里就用好友验证来代替。
思路分析:
1.从数据库中查找出所有的好友,放入一个集合(friendTemList)
2.创建一个存放其他名字的集合(otherTemList),用来混淆用户视听
3.创建一个随机数x(0-3),用来从friendTemList取出下标为0-x的userName,从otherTemLis取下标为0-(3-x)的userName,组成一个新的集合(finalList)
4.已经取出来的userName要从friendTemList及otherTemList中移除(Remove)
5.将friendTemList,otherTemList,finalList传递给前端。其friendTemList、otherTemList的作用是下次取userName是从它们里边取,finalList是显示在前端供用户选择的。
6.当friendTemList,otherTemList的大小(size)小于0或小于对应的随机数时,重置集合

实现中遇到的问题及解决方案:
1.我自己也是个前端小白,原来以为js能处理后台传递的java集合(List),后来了解到并不能,所以我重新定义了一个好友验证的实体对象(FriendVerify),方便转换成json对象传递到前端;`
public class FriendVerify {

private String userName;
private String friendTem;
private String otherTem;
private String finalFriend;`

friendTem表示临时的好友字符串,otherTem表示临时的非好友字符串,finalFriend表示显示在前端供用户选择的字符串。它们的形式都是:
张三,李四,王五,....
在每个userName之间加个","是为了方便传递给前端进行切割。不过这样做也将后台代码变得复杂了一些,。。。,谁叫我是前端小白呢?就将就下吧!后台首先将字符串转换成数组,数组再转换成List集合。下面来看代码:
前端部分:主要将userName,friendTem,otherTem传递给后台。
function friendVerify(){
          	
   var userLoginName = currentUser.loginName;
   if(userLoginName == null || userLoginName == "" || userLoginName == 0){
         alert("请先输入登录名");
         return false;
     }else{
         $.ajax({
		         url:"${ctx}/toVerifyFriend?random="+ Math.random(),
		         type:"post",//发送请求的方式:(GET|POST)
				 dataType:"json",//服务器响应的数据类型
				 contentType:"application/json", //  编码类型
				 data:JSON.stringify({userName : userLoginName,friendTem : friendTem,otherTem : otherTem}),
				async:true,
				success:function(data){
				     if(data != null && data != ""){
			            friendTem = data.friendVerify.friendTem;
		            	otherTem = data.friendVerify.otherTem;
		            	var finalFriend = data.friendVerify.finalFriend;
		            	var finalFriendArray = new Array();
		            	finalFriendArray = finalFriend.split(",");
		            	var htmlstr="";
		            	for(var i=0;i<finalFriendArray.length;i++){
		            		htmlstr+="<label style='margin-left: 18px;line-height: 29px;'><input type='checkBox' value="+finalFriendArray[i]+" name='friendName'  style='margin-top: 8px'/><b style='margin-left:3px;'>"+finalFriendArray[i]+"</b></label>";
		            	}
		            	htmlstr+="<label style='margin-left: 40px'><input type='button' value='换一批' name='huanyipi' style='margin-top: 5px;' onclick='friendVerify()'/></label>";
		            	$("#init").html(htmlstr);
		            		}
		            	}	
		            	})
          	return false;
          	}
          };`

后台代码:这里我直接将逻辑写在了Controller层,一般来说,逻辑写在Service层的实现类中,大家也不用纠结这个问题
	@RequestMapping("/toVerifyFriend")
	public void veriFyFriend(@RequestBody FriendVerify friendVerify,
		    HttpServletResponse response) throws Exception{
	
		int flag = (int)(Math.random()*2 + 1);
		
		String userName = friendVerify.getUserName();
		
		String friendTem = friendVerify.getFriendTem();
		String[] friendTemArray = friendTem.split(",");
		List<String> friendTemList = CreateListUtils.arrayToList(friendTemArray);
		
		String otherTem = friendVerify.getOtherTem();
		String[] otherTemArray = otherTem.split(",");
		List<String> otherTemList = CreateListUtils.arrayToList(otherTemArray);
		
		if(friendTemArray==null||friendTemArray.length<flag||friendTemArray[0].equals("")){
			friendTemList.clear();
			System.out.println(friendTemList.size());
			friendTemList.addAll(InitFriendList(userName));
				//Object[] friendArray = friendTemList.toArray();
		}
		if(otherTemArray==null||otherTemArray.length<(3-flag)||otherTemArray[0].equals("")){
			otherTemList.clear();
			System.out.println(otherTemList.size());
			otherTemList.addAll(InitOtherList());
			
		}
		
		List<String> newfriendList = CreateListUtils.listFactory(friendTemList, flag);
		friendTemList.removeAll(newfriendList);
		
		List<String> newOtherList = CreateListUtils.listFactory(otherTemList, 3-flag);
		otherTemList.removeAll(newOtherList);
		
		
		List<String> finalList = new ArrayList<>();
		finalList.addAll(newfriendList);
		finalList.addAll(newOtherList);
		
		FriendVerify friendVer = new FriendVerify();
		friendVer.setFriendTem(CreateListUtils.listToString(friendTemList));
		friendVer.setOtherTem(CreateListUtils.listToString(otherTemList));
		friendVer.setFinalFriend(CreateListUtils.listToString(finalList));
		
		
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("friendVerify", friendVer);
		response.setContentType("text/html;charset=UTF-8");
    	
    	response.getWriter().println(jsonObject.toJSONString());
    	response.getWriter().flush();
			
	}

//初始化friendList
public List<String> InitFriendList(String userName){
		
	List<Friend> friendsList = friendService.findFriendByName(userName);
	List<String> friendList = new ArrayList<>();
	for(Friend friend:friendsList){
		if(friend.getFriend_1().equals(userName)){
			friendList.add(friend.getFriend_2());
		}else{
			friendList.add(friend.getFriend_1());
			}
		}
	
		return friendList;
	
	}
	
	//初始化otherList
	public List<String> InitOtherList(){
		
		List<String> otherList = new ArrayList<>();
		otherList.add("赵峰");
		otherList.add("李洵");
		otherList.add("吕德财");
		otherList.add("高红军");
		otherList.add("刘雪芬");
		otherList.add("温展楚");
		otherList.add("钟琴思");
		otherList.add("张岐江");
		otherList.add("王凤琪");
		return otherList;
	}



工具类:这里有一个奇怪的问题:我如果用oldList.subList(0, flag)截取List值的时候,上面代码中报错,显示在finalList.addAll(newfriendList);这个方法报错。暂时没有研究,待我有空慢慢研究,有知道的朋友可以告诉我

public class CreateListUtils {
	
	    //根据随机数生成List
		public static List<String> listFactory(List<String> oldList,int flag){
			
			List<String> newList = new ArrayList<>();
			
			for(int i = 0;i<flag;i++){
				
				newList.add(oldList.get(i)); 
				
			}
			//newList = oldList.subList(0, flag);
			return newList;
			
		}
		
		//数组转换成List
		public static List<String> arrayToList(String[] array){
			
			List<String> toList = new ArrayList<>();
			
			for(int i=0;i<array.length;i++){
				toList.add(array[i]);
			}
			
			
			return toList;
			
		}
		//List转换成字符串
		public static String listToString(List<String> list){
			
			StringBuffer toString = new StringBuffer();
			for(int i=0;i<list.size();i++){
				if(i<list.size()-1){
					toString.append(list.get(i));
					toString.append(",");
				}else{
					toString.append(list.get(i));
				}
			}
			return toString.toString();
			
		}

}


好友验证:这里我要SpringMvc框架来接收checkBox标签传过来的数组。
@RequestMapping("/toLogFriendVerify")
public String logFriendVerify(@RequestParam(value = "friendName", required = false) String[] friendName,User currentUser,HttpServletRequest request){
	HttpSession session = request.getSession(false);
		
	List<String> finalFriendList = CreateListUtils.arrayToList(friendName);
	List<String> friendList = InitFriendList(currentUser.getLoginName());
	if(friendList.containsAll(finalFriendList)){
		User finalUser = userService.findUserByName(currentUser.getLoginName());
		 //session处理,如果存在该用户的session,先将存在的session注销,再生成新的session
		 sessionHandlerByCacheMap(session,finalUser);
		
		return "redirect:/toIndex"; 
		}
	return "redirect:/toLoginVerify"; 
	}

效果图如下:
这里写图片描述

好友验证的思路大概就是这样的,大家可以试试实现,原谅我前端写得有点烂,确实不太会前端。可能有一些好友为空的情况我没有考虑,这些就大家自己去加判断了。如果有更好的建议可以一起探讨下。有很多朋友可能会说,这些都是早就有的东西,直接用别人写的不就行了吗?我的理解是:很多东西需要我们自己去想,去实现,特别是编程思想,而且特别是刚学编程的小白。
后面我会继续更新博客,跟大家一起探讨如何通过Spring的session监听及数据库中的登录状态来控制用户实现唯一登录的问题,以及用websocket实现群聊及单聊,这些功能也基本实现了,不过有一点小bug,主要是前端有点问题。。。。

关于我


    可以扫描关注下面的公众号(公众号:猿类进化论)
在这里插入图片描述

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值