提示: 因为工程稍微有点大对我个人来说,所以可能在某些方面讲的不清楚或逻辑性不够强,如果有问题请及时@我。
原工程:https://github.com/LineChen/
二、找回密码
注意点:
1.找回密码不是简单的从数据库把密码取出来然后发送给用户。首先,数据库存储的密码是经过MD5转换的,无法得到密码明文,再说就算能得到,也不能发送密码明文给客户,不然这又违背了安全性原则。
2.这里是这样处理的:系统直接生成一个密码,然后修改数据库,然后把这个密码通过邮件方式发送给用户
发送邮件的类:
package com.server_utils;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class SendEmailToClient {
Properties properties=null;
Session session=null;
Message messgae=null;
Transport tran=null;
public SendEmailToClient(String clinetmailAddress,String subject,String content)
{
try {
properties=new Properties();
properties.setProperty("mail.transport.protocol", "smtp");//发送邮件协议
properties.setProperty("mail.smtp.auth", "true");//需要验证
// properties.setProperty("mail.debug", "true");//设置debug模式后台输出邮件发送的过程
session = Session.getInstance(properties);
session.setDebug(false);//debug模式->控制台会显示发送邮件的具体细节
//邮件信息
messgae = new MimeMessage(session);
messgae.setFrom(new InternetAddress("15764230067@163.com"));//设置发送人
messgae.setText(content);//设置邮件内容
messgae.setSubject(subject);//设置邮件主题
//发送邮件
tran = session.getTransport();
tran.connect("smtp.163.com", 25, "15764230067@163.com", "BigBad670067");//连接到新浪邮箱服务器
// tran.connect("smtp.qq.com", 25, "Michael8@qq.vip.com", "xxxx");//连接到QQ邮箱服务器
tran.sendMessage(messgae, new Address[]{ new InternetAddress(clinetmailAddress)});//设置邮件接收人
tran.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
处理代码:
/**
* 处理找回密码
*
* @param session
* @param moMoMsg
*/
public void handleFindPasswd(IoSession session, iMoMoMsg moMoMsg) {
JSONObject json = JSON.parseObject(moMoMsg.msgJson);
String userEmail = json.getString(MsgKeys.userEmail);// 邮箱地址
SqlModel model = new SqlModel();
String userName = model.getUserName(userEmail, true);
iMoMoMsg Notify = new iMoMoMsg();
Notify.symbol = ‘+’;
JSONObject NotifyJson = new JSONObject();
String newPwd = PasswordUtil.getInstance().createNewPwd();
if (!userName.equals(“null”)) {
String sql = “update imomo_clients set userPasswd = ? where userEmail = ?”;
String[] paras = { PasswordUtil.getInstance().toMD5(newPwd),
userEmail };
if (model.updateDb(sql, paras)) {
// 发送邮件…
new SendEmailToClient(userEmail, “找回密码”, “尊敬的” + userName
+ “:\n 您好,系统为您随机生成的密码是:” + newPwd + “,登录后请尽快修改密码!”);
NotifyJson.put(MsgKeys.msgType,
iMoMoMsgTypes.FIND_PASSWD_SUCCESS);
} else {
NotifyJson.put(MsgKeys.msgType,
iMoMoMsgTypes.FIND_PASSWD_FAILED);
}
} else {
System.out.println(“没有该用户”);
NotifyJson.put(MsgKeys.msgType, iMoMoMsgTypes.FIND_PASSWD_FAILED);
}
Notify.msgJson = NotifyJson.toJSONString();
session.write(Notify);
}
三、重置密码、修改用户名、修改个性签名等个人信息
处理方法都是一样的,根据用户Id直接修改数据库
/**
* 处理修改个人信息
*
* @param moMoMsg
*/
public void handleResetUserInfo(iMoMoMsg moMoMsg) {
JSONObject json = JSON.parseObject(moMoMsg.msgJson);
String userId = json.getString(MsgKeys.userId);
int type = json.getIntValue(MsgKeys.msgType);
SqlModel model = new SqlModel();
String sql = “”;
String[] paras = new String[2];
switch (type) {
case iMoMoMsgTypes.RESET_USERNAME:
sql = “update imomo_clients set userName = ? where userId = ?”;
paras[0] = json.getString(MsgKeys.userName);
break;
case iMoMoMsgTypes.RESET_SEX:
sql = “update imomo_clients set userSex = ? where userId = ?”;
paras[0] = json.getString(MsgKeys.userSex);
break;
case iMoMoMsgTypes.RESET_BIRTHDAY:
sql = “update imomo_clients set userBirthday = ? where userId = ?”;
paras[0] = json.getString(MsgKeys.userBirthday);
break;
case iMoMoMsgTypes.RESET_SIGNATUE:
sql = “update imomo_clients set personSignature = ? where userId = ?”;
paras[0] = json.getString(MsgKeys.personSignature);
break;
}
paras[1] = userId;
if (model.updateDb(sql, paras)) {
System.out.println(“修改用信息成功”);
} else {
System.out.println(“修改用户信失败”);
}
// 不发送通知消息
}
四、修改个人头像
修改个人头像不仅仅是修改一下用户头像文件就完事了,还要及时通知自己的好友“我换头像啦”。
原因是:这里客户端每次请求好友列表时会判断手机本地是否有该好友的头像,如果有就不用向服务器请求(这样也是为了减少不必要的流量)。所以如果这里不去主动提醒好友“我换头像了”,假如他的某个好友手机本地已经存在头像了,那在这个好友列表中显示的头像一直以前的。
处理代码:
/**
* 处理修改头像
*
* @param session
* @param moMoMsg
*/
public void handleResetHead(IoSession session, iMoMoMsg moMoMsg) {
JSONObject json = JSON.parseObject(moMoMsg.msgJson);
String userId = json.getString(MsgKeys.userId);
String userHeadPath = StaticValues.HEAD_P_PATH + userId + “.png”;
iMoMoMsg Notify = new iMoMoMsg();
Notify.symbol = ‘+’;
JSONObject NotifyJson = new JSONObject();
try {
FileTools.getInstance().saveMultyFile(userHeadPath,
moMoMsg.msgBytes);
// 修改成功
System.out.println(“修改头像成功”);
NotifyJson.put(MsgKeys.msgType, iMoMoMsgTypes.RESET_HEAD_SUCCESS);
SqlModel model = new SqlModel();
String[] friendList = model.getFriendIds(userId);
iMoMoMsg resetHead = new iMoMoMsg();
resetHead.symbol = ‘-‘;
JSONObject resetHeadJson = new JSONObject();
resetHeadJson.put(MsgKeys.msgType, iMoMoMsgTypes.RESET_HEAD);
resetHeadJson.put(MsgKeys.friendId, userId);// 通知好友是谁改头像的
resetHeadJson.put(MsgKeys.userId, userId);// 我发的
resetHead.msgJson = resetHeadJson.toJSONString();
resetHead.msgBytes = moMoMsg.msgBytes;
for (String friendId : friendList) {
// 判断是否在线,在线直接转发,不在线缓存到数据库中
if (ManageClientSession.isContainsId(friendId)) {
ManageClientSession.getSession(friendId).write(resetHead);
// System.out.println(“转发成功..”);
} else {
if (!model.isTableExists(“mc_” + friendId))// “mc_” + userId
model.createCacheTable(friendId);// 创建缓存数据库
MsgDb msgDb = MsgTranceUtil.getInstance().Trance_Net2Db(
resetHead);
if (model.insertCacheMsg(msgDb, friendId)) {
// System.out.println(“缓存成功”);
} else {
// System.out.println(“缓存失败”);
}
}
}
} catch (Exception e) {
// 修改失败
NotifyJson.put(MsgKeys.msgType, iMoMoMsgTypes.RESET_HEAD_FAILED);
// System.out.println(“修改头像失败”);
}
Notify.msgJson = NotifyJson.toJSONString();
session.write(Notify);
}
这里要考虑是否发送离线消息,也就是如果该用户的好友在线,就直接发送消息,否则发送离线消息(就是先把该消息保存在数据库中,等那个好友下次上线的时候先去数据库查询一下看是否有离线消息,有的话就发送即可)这个下次再具体讨论。
原文地址:http://blog.csdn.net/u011102153/article/details/46558737