用户登录与注册的主要代码都在WebContent\src\base\auth\checkLoginData.lzx文件中
<simpleLabelButton labelid="123" name="_register" width="160" y="$once{ parent.height-40 }" visible="false" x="510" height="22"><handler name="onclick"><![CDATA[this.parent._register.setAttribute('visible',false);if (this.parent.childObj != null) {this.parent.childObj.destroy();}this.parent.childObj = new lz.registerNewUser(canvas,{refObj:this.parent,user_login_minimum_length:parent.user_login_minimum_length,user_pass_minimum_length:parent.user_pass_minimum_length});]]></handler></simpleLabelButton>
主界面中,点击【Not a member? 】按钮后,将调用registerNewUser(),跳出注册界面,填写好username, password, email等一系列信息后,点击【 Register】后将执行如下代码:
<simpleLabelButton name="registerB" labelid="121" width="120" x="240" y="332"><handler name="onclick"><![CDATA[var pwd1 = strtrim(this.parent.userpass1.getText());var pwd2 = strtrim(this.parent.userpass2.getText()); var login = strtrim(this.parent.username.getText()); var email = strtrim(this.parent.email.getText()); if (pwd1!=pwd2) {new lz.rpcErrorDialog(canvas,{errorid:-6});} else if(pwd1.length<parent.user_pass_minimum_length || login<parent.user_login_minimum_length){var addInfo = "<br/> "+ parent.user_pass_minimum_length + " / " + parent.user_login_minimum_length;new lz.rpcErrorDialog(canvas,{errorid:-7,addInfo:addInfo});} else if (email=="") {new lz.rpcErrorDialog(canvas,{errorid:-53});} else {this.parent.regObject = new Array();this.parent.regObject["SID"]=canvas.sessionId;this.parent.regObject["Username"]=login;this.parent.regObject["Userpass"]=this.parent.userpass1.getText();this.parent.regObject["lastname"]=this.parent.lastname.getText();this.parent.regObject["firstname"]=this.parent.firstname.getText();this.parent.regObject["email"]=email;this.parent.regObject["jNameTimeZone"]=this.parent._timeZone.getValue();this.parent.regObject["age"]=0;this.parent.regObject["street"]='';this.parent.regObject["additionalname"]='';this.parent.regObject["fax"]='';this.parent.regObject["zip"]='';this.parent.regObject["states_id"]=Number(this.parent._state.getValue());this.parent.regObject["town"]='';this.parent.regObject["language_id"]=this.parent.languages.getValue();this.parent.regObject["domain"]=canvas.rtmphostlocal; this.parent.regObject["port"]=canvas.red5httpport; this.parent.regObject["webapp"]=canvas.httpRootKey; if( $debug ) Debug.write("parent.regObject: ",parent.regObject);this.parent.registerUserByObject.doCall();}]]></handler></simpleLabelButton>
调用了registerUserByObject(), 具体实现如下:
<netRemoteCallHib name="registerUserByObject" funcname="xmlcrm.registerUserByObject" remotecontext="$once{ canvas.thishib }" activeErrorHandler="true" > <netparam><method name="getValue"> return this.parent.parent.regObject; </method></netparam> <handler name="ondata" args="value"><![CDATA[//The onResult-Handler will be called be the rtmpconnectionif ($debug) Debug.write("registerUserByObject: ",value);if (!(value<0)){//Debug.write("successfully registered");new lz.rpcErrorDialog(canvas.main_content._content.inner,{errorid:-18});this.parent.refObj.username.setAttribute('text',this.parent.username.getText());this.parent.refObj.userpass.setAttribute('text',this.parent.userpass1.getText());this.parent.close();} else if (value == -40) {this.parent.refObj.username.setAttribute('text',this.parent.username.getText());this.parent.refObj.userpass.setAttribute('text',this.parent.userpass1.getText());this.parent.close();}]]></handler> </netRemoteCallHib>
我们看到这是一个远程调用,它将调用服务器上的registerUserByObject()函数(在src\org\apache\openmeetings\remote\MainService.java中)
public Long registerUserByObject(Object regObjectObj) {try {@SuppressWarnings("unchecked")Map<?, ?> regObject = (Map<Object, Object>) regObjectObj;String domain = regObject.get("domain").toString();String port = regObject.get("port").toString();String webapp = regObject.get("webapp").toString();String baseURL = "http://" + domain + ":" + port + webapp;if (port.equals("80")) {baseURL = "http://" + domain + webapp;} else if (port.equals("443")) {baseURL = "https://" + domain + webapp;}String tz = (String)regObject.get("jNameTimeZone");if (tz == null || tz.length() == 0) {//Empty tzreturn -55L;}return userManager.registerUser(regObject.get("Username").toString(), regObject.get("Userpass").toString(),regObject.get("lastname").toString(),regObject.get("firstname").toString(),regObject.get("email").toString(), new Date(), regObject.get("street").toString(),regObject.get("additionalname").toString(),regObject.get("fax").toString(), regObject.get("zip").toString(),Long.valueOf(regObject.get("states_id").toString()).longValue(), regObject.get("town").toString(),Long.valueOf(regObject.get("language_id").toString()).longValue(), "", false, baseURL, true,tz);} catch (Exception ex) {log.error("registerUserByObject", ex);}return new Long(-1);}
这里面又调用了userManager.registerUser(), 顺着代码一路跟踪下去,调用关系如下:
public Long registerUser(String login, String Userpass, String lastname,String firstname, String email, Date age, String street,String additionalname, String fax, String zip, long states_id,String town, long language_id, String phone, boolean sendSMS, String baseURL,boolean generateSipUserData, String jNameTimeZone) {boolean sendConfirmation = baseURL != null&& !baseURL.isEmpty()&& 1 == configurationDao.getConfValue("sendEmailWithVerficationCode", Integer.class, "0");return registerUser(login, Userpass, lastname, firstname, email, age,street, additionalname, fax, zip, states_id, town, language_id,phone, sendSMS, baseURL, generateSipUserData, jNameTimeZone, sendConfirmation);}
|
|
V
private Long registerUser(String login, String Userpass, String lastname,String firstname, String email, Date age, String street,String additionalname, String fax, String zip, long states_id,String town, long language_id, String phone, boolean sendSMS, String baseURL,boolean generateSipUserData, String jNameTimeZone, Boolean sendConfirmation) {try {// Checks if FrontEndUsers can registerif ("1".equals(configurationDao.getConfValue("allow_frontend_register", String.class, "0"))) {// TODO: Read and generate SIP-Data via RPC-Interface Issue 1098Long user_id = this.registerUserInit(3, 1, 0, 1, login,Userpass, lastname, firstname, email, age, street,additionalname, fax, zip, states_id, town, language_id,true, Arrays.asList(configurationDao.getConfValue("default_domain_id", Long.class, null)), phone,sendSMS, baseURL,sendConfirmation, jNameTimeZone, false, "", "", false, true);if (sendConfirmation) {return new Long(-40);}return user_id;}} catch (Exception e) {log.error("[registerUser]", e);}return null;}
|
|
public Long registerUserInit(long user_level, long level_id, int availible,int status, String login, String password, String lastname,String firstname, String email, Date age, String street,String additionalname, String fax, String zip, long states_id,String town, long language_id, boolean sendWelcomeMessage,List<Long> organisations, String phone, boolean sendSMS, String baseURL,Boolean sendConfirmation, String jname_timezone, Boolean forceTimeZoneCheck,String userOffers, String userSearchs, Boolean showContactData,Boolean showContactDataToContacts) throws Exception {return registerUserInit(user_level, level_id, availible,status, login, password, lastname,firstname, email, age, street,additionalname, fax, zip, states_id,town, language_id, sendWelcomeMessage,organisations, phone, sendSMS, baseURL,sendConfirmation,omTimeZoneDaoImpl.getOmTimeZone(jname_timezone), forceTimeZoneCheck,userOffers, userSearchs, showContactData,showContactDataToContacts);}
|
|
public Long registerUserInit(long user_level, long level_id, int availible,int status, String login, String password, String lastname,String firstname, String email, Date age, String street,String additionalname, String fax, String zip, long states_id,String town, long language_id, boolean sendWelcomeMessage,List<Long> organisations, String phone, boolean sendSMS, String baseURL,Boolean sendConfirmation,OmTimeZone timezone, Boolean forceTimeZoneCheck,String userOffers, String userSearchs, Boolean showContactData,Boolean showContactDataToContacts) throws Exception {// TODO: make phone number persistent// User Level must be at least Admin// Moderators will get a temp update of there UserLevel to add Users to// their Groupif (authLevelUtil.checkModLevel(user_level)) {Integer userLoginMinimumLength = configurationDao.getConfValue("user.login.minimum.length", Integer.class, "4");if (userLoginMinimumLength == null) {throw new Exception("user.login.minimum.length problem");}// Check for required dataif (login.length() >= userLoginMinimumLength.intValue()) {// Check for duplicatesboolean checkName = usersDao.checkUserLogin(login);boolean checkEmail = emailManagement.checkUserEMail(email);if (checkName && checkEmail) {String hash = cryptManager.getInstanceOfCrypt().createPassPhrase(login+ CalendarPatterns.getDateWithTimeByMiliSeconds(new Date()));String link = baseURL + "activateUser?u=" + hash;if (sendWelcomeMessage && email.length() != 0) {// We need to pass the baseURL to check if this is// really set to be sendString sendMail = emailManagement.sendMail(login,password, email, link, sendConfirmation);if (!sendMail.equals("success"))return new Long(-19);}Address adr = new Address();adr.setStreet(street);adr.setZip(zip);adr.setTown(town);adr.setStates(statemanagement.getStateById(states_id));adr.setAdditionalname(additionalname);adr.setComment("");adr.setFax(fax);adr.setPhone(phone);adr.setEmail(email);// If this user needs first to click his E-Mail verification// code then set the status to 0if (sendConfirmation) {status = 0;}Long user_id = addUser(level_id, availible, status,firstname, login, lastname, language_id, password,adr, sendSMS, age, hash, timezone,forceTimeZoneCheck, userOffers, userSearchs,showContactData, showContactDataToContacts, organisations);log.debug("Added user-Id " + user_id);if (user_id == null) {return new Long(-111);}/** Long adress_emails_id =* emailManagement.registerEmail(email, address_id,""); if* (adress_emails_id==null) { return new Long(-112); }*/if (adr.getAdresses_id() > 0 && user_id > 0) {return user_id;} else {return new Long(-16);}} else {if (!checkName) {return new Long(-15);} else if (!checkEmail) {return new Long(-17);}}} else {return new Long(-13);}}return new Long(-1);}
|
|
public Long addUser(long level_id, int availible, int status,String firstname, String login, String lastname, long language_id,String userpass, Address adress, boolean sendSMS, Date age, String hash,OmTimeZone timezone,Boolean forceTimeZoneCheck, String userOffers, String userSearchs,Boolean showContactData, Boolean showContactDataToContacts, List<Long> orgIds) {try {User users = new User();users.setFirstname(firstname);users.setLogin(login);users.setLastname(lastname);users.setAge(age);users.setAdresses(adress);users.setSendSMS(sendSMS);users.setAvailible(availible);users.setLastlogin(new Date());users.setLasttrans(new Long(0));users.setLevel_id(level_id);users.setStatus(status);users.setSalutations_id(1L);users.setStarttime(new Date());users.setActivatehash(hash);users.setOmTimeZone(timezone);users.setForceTimeZoneCheck(forceTimeZoneCheck);users.setUserOffers(userOffers);users.setUserSearchs(userSearchs);users.setShowContactData(showContactData);users.setShowContactDataToContacts(showContactDataToContacts);// this is needed cause the language is not a needed data at// registeringif (language_id != 0) {users.setLanguage_id(new Long(language_id));} else {users.setLanguage_id(null);}users.updatePassword(cryptManager, configurationDao, userpass);users.setRegdate(new Date());users.setDeleted(false);//new user add organizations without checksif (orgIds != null) {List<Organisation_Users> orgList = users.getOrganisation_users();for (Long orgId : orgIds) {orgList.add(organisationManager.getOrgUser(orgId, null));}}return addUser(users);} catch (Exception ex2) {log.error("[registerUser]", ex2);}return null;}
|
|
V
最后将用户信息插入数据库。
public Long addUser(User usr) {try {em.persist(usr);//em.refresh(usr);em.flush();return usr.getUser_id();} catch (Exception ex2) {log.error("[addUser]", ex2);}return null;}
到这里就完成了一个新用户的注册过程!