package com.jspxcms.core.web.fore; import java.util.Date; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import com.jspxcms.common.security.Captchas; import com.jspxcms.common.web.Servlets; import com.jspxcms.common.web.Validations; import com.jspxcms.core.domain.GlobalMail; import com.jspxcms.core.domain.GlobalRegister; import com.jspxcms.core.domain.Site; import com.jspxcms.core.domain.User; import com.jspxcms.core.service.MemberGroupService; import com.jspxcms.core.service.OrgService; import com.jspxcms.core.service.UserService; import com.jspxcms.core.support.Constants; import com.jspxcms.core.support.Context; import com.jspxcms.core.support.ForeContext; import com.jspxcms.core.support.Response; import com.octo.captcha.service.CaptchaService; /** * RegisterController * * @author liufang * */ @Controller public class RegisterController { /** * 注册模板 */ public static final String REGISTER_TEMPLATE = "sys_member_register.html"; /** * 注册结果模板。提示会员注册成功,或提示会员接收验证邮件。 */ public static final String REGISTER_MESSAGE_TEMPLATE = "sys_member_register_message.html"; /** * 验证会员模板 */ public static final String VERIFY_MEMBER_TEMPLATE = "sys_member_verify_member.html"; /** * 忘记密码模板 */ public static final String FORGOT_PASSWORD_TEMPLATE = "sys_member_forgot_password.html"; /** * 找回密码模板 */ public static final String RETRIEVE_PASSWORD_TEMPLATE = "sys_member_retrieve_password.html"; @RequestMapping(value = "/register.jspx") public String registerForm(HttpServletRequest request, HttpServletResponse response, org.springframework.ui.Model modelMap) { Response resp = new Response(request, response, modelMap); Site site = Context.getCurrentSite(request); GlobalRegister registerConf = site.getGlobal().getRegister(); if (registerConf.getMode() == GlobalRegister.MODE_OFF) { return resp.warning("register.off"); } Map<String, Object> data = modelMap.asMap(); ForeContext.setData(data, request); return site.getTemplate(REGISTER_TEMPLATE); } @RequestMapping(value = "/register.jspx", method = RequestMethod.POST) public String registerSubmit(String captcha, String username, String password, String email, String gender, Date birthDate, String bio, String comeFrom, String qq, String msn, String weixin, HttpServletRequest request, HttpServletResponse response, org.springframework.ui.Model modelMap) { Response resp = new Response(request, response, modelMap); Site site = Context.getCurrentSite(request); GlobalRegister reg = site.getGlobal().getRegister(); String result = validateRegisterSubmit(request, resp, reg, captcha, username, password, email, gender); if (resp.hasErrors()) { return result; } int verifyMode = reg.getVerifyMode(); String ip = Servlets.getRemoteAddr(request); int groupId = reg.getGroupId(); int orgId = reg.getOrgId(); int status = verifyMode == GlobalRegister.VERIFY_MODE_NONE ? User.NORMAL : User.UNVERIFIED; User user = userService.register(ip, groupId, orgId, status, username, password, email, gender, birthDate, bio, comeFrom, qq, msn, weixin); if (verifyMode == GlobalRegister.VERIFY_MODE_EMAIL) { GlobalMail mail = site.getGlobal().getMail(); String subject = reg.getVerifyEmailSubject(); String text = reg.getVerifyEmailText(); userService.sendVerifyEmail(site, user, mail, subject, text); } resp.addData("verifyMode", verifyMode); resp.addData("id", user.getId()); resp.addData("username", user.getUsername()); resp.addData("email", user.getEmail()); return resp.post(); } @RequestMapping(value = "/register_message.jspx") public String registerMessage(String email, Integer verifyMode, HttpServletRequest request, HttpServletResponse response, org.springframework.ui.Model modelMap) { Response resp = new Response(request, response, modelMap); Site site = Context.getCurrentSite(request); GlobalRegister reg = site.getGlobal().getRegister(); String username = Servlets.getParameter(request, "username"); String result = validateRegisterMessage(request, resp, reg, username, email, verifyMode); if (resp.hasErrors()) { return result; } User registerUser = userService.findByUsername(username); modelMap.addAttribute("registerUser", registerUser); modelMap.addAttribute("verifyMode", verifyMode); Map<String, Object> data = modelMap.asMap(); ForeContext.setData(data, request); return site.getTemplate(REGISTER_MESSAGE_TEMPLATE); } @RequestMapping(value = "/verify_member.jspx") public String verifyMember(String key, HttpServletRequest request, HttpServletResponse response, org.springframework.ui.Model modelMap) { Response resp = new Response(request, response, modelMap); List<String> messages = resp.getMessages(); Site site = Context.getCurrentSite(request); if (!Validations.notEmpty(key, messages, "key")) { return resp.badRequest(); } User keyUser = userService.findByValidation( Constants.VERIFY_MEMBER_TYPE, key); userService.verifyMember(keyUser); modelMap.addAttribute("keyUser", keyUser); Map<String, Object> data = modelMap.asMap(); ForeContext.setData(data, request); return site.getTemplate(VERIFY_MEMBER_TEMPLATE); } @RequestMapping(value = "/forgot_password.jspx") public String forgotPasswordForm(HttpServletRequest request, HttpServletResponse response, org.springframework.ui.Model modelMap) { Site site = Context.getCurrentSite(request); Map<String, Object> data = modelMap.asMap(); ForeContext.setData(data, request); return site.getTemplate(FORGOT_PASSWORD_TEMPLATE); } @RequestMapping(value = "/forgot_password.jspx", method = RequestMethod.POST) public String forgotPasswordSubmit(String username, String email, HttpServletRequest request, HttpServletResponse response, org.springframework.ui.Model modelMap) { Response resp = new Response(request, response, modelMap); String result = validateForgotPasswordSubmit(request, resp, username, email); if (resp.hasErrors()) { return result; } Site site = Context.getCurrentSite(request); User forgotUser = userService.findByUsername(username); GlobalRegister reg = site.getGlobal().getRegister(); GlobalMail mail = site.getGlobal().getMail(); String subject = reg.getPasswordEmailSubject(); String text = reg.getPasswordEmailText(); userService.sendPasswordEmail(site, forgotUser, mail, subject, text); resp.addData("username", username); resp.addData("email", email); return resp.post(); } @RequestMapping(value = "/retrieve_password.jspx") public String retrievePasswordForm(String key, HttpServletRequest request, HttpServletResponse response, org.springframework.ui.Model modelMap) { Response resp = new Response(request, response, modelMap); List<String> messages = resp.getMessages(); if (!Validations.notEmpty(key, messages, "key")) { return resp.badRequest(); } Site site = Context.getCurrentSite(request); User retrieveUser = userService.findByValidation( Constants.RETRIEVE_PASSWORD_TYPE, key); modelMap.addAttribute("retrieveUser", retrieveUser); modelMap.addAttribute("key", key); Map<String, Object> data = modelMap.asMap(); ForeContext.setData(data, request); return site.getTemplate(RETRIEVE_PASSWORD_TEMPLATE); } @RequestMapping(value = "/retrieve_password.jspx", method = RequestMethod.POST) public String retrievePasswordSubmit(String key, String password, HttpServletRequest request, HttpServletResponse response, org.springframework.ui.Model modelMap) { Response resp = new Response(request, response, modelMap); List<String> messages = resp.getMessages(); if (!Validations.notEmpty(key, messages, "key")) { return resp.post(401); } if (!Validations.notNull(password, messages, "password")) { return resp.post(402); } User retrieveUser = userService.findByValidation( Constants.RETRIEVE_PASSWORD_TYPE, key); if (retrieveUser == null) { return resp.post(501, "retrievePassword.invalidKey"); } userService.passwordChange(retrieveUser, password); return resp.post(); } @ResponseBody @RequestMapping(value = "/check_username.jspx") public String checkUsername(String username, String original, HttpServletRequest request, HttpServletResponse response) { Servlets.setNoCacheHeader(response); if (StringUtils.isBlank(username)) { return "true"; } if (StringUtils.equals(username, original)) { return "true"; } // 检查数据库是否重名 boolean exist = userService.usernameExist(username); if (!exist) { return "true"; } else { return "false"; } } private String validateRegisterSubmit(HttpServletRequest request, Response resp, GlobalRegister reg, String captcha, String username, String password, String email, String gender) { List<String> messages = resp.getMessages(); if (!Captchas.isValid(captchaService, request, captcha)) { return resp.post(100, "error.captcha"); } if (reg.getMode() == GlobalRegister.MODE_OFF) { return resp.post(501, "register.off"); } Integer groupId = reg.getGroupId(); if (groupService.get(groupId) == null) { return resp.post(502, "register.groupNotSet"); } Integer orgId = reg.getOrgId(); if (orgService.get(orgId) == null) { return resp.post(503, "register.orgNotSet"); } if (!Validations.notEmpty(username, messages, "username")) { return resp.post(401); } if (!Validations.length(username, reg.getMinLength(), reg.getMaxLength(), messages, "username")) { return resp.post(402); } if (!Validations.pattern(username, reg.getValidCharacter(), messages, "username")) { return resp.post(403); } if (!Validations.notEmpty(password, messages, "password")) { return resp.post(404); } if (reg.getVerifyMode() == GlobalRegister.VERIFY_MODE_EMAIL && !Validations.notEmpty(email, messages, "email")) { return resp.post(405); } if (!Validations.email(email, messages, "email")) { return resp.post(406); } if (!Validations.pattern(gender, "[F,M]", messages, "gender")) { return resp.post(407); } return null; } private String validateRegisterMessage(HttpServletRequest request, Response resp, GlobalRegister reg, String username, String email, Integer verifyMode) { List<String> messages = resp.getMessages(); if (!Validations.notEmpty(username, messages, "username")) { return resp.badRequest(); } if (!Validations.notEmpty(email, messages, "email")) { return resp.badRequest(); } if (!Validations.notNull(verifyMode, messages, "verifyMode")) { return resp.badRequest(); } User registerUser = userService.findByUsername(username); if (!Validations.exist(registerUser)) { return resp.notFound(); } if (!registerUser.getEmail().equals(email)) { return resp.notFound("email not found: " + email); } if (reg.getMode() == GlobalRegister.MODE_OFF) { return resp.warning("register.off"); } return null; } private String validateForgotPasswordSubmit(HttpServletRequest request, Response resp, String username, String email) { List<String> messages = resp.getMessages(); if (!Validations.notEmpty(username, messages, "username")) { return resp.post(401); } if (!Validations.notEmpty(email, messages, "email")) { return resp.post(402); } User forgotUser = userService.findByUsername(username); if (!Validations.exist(forgotUser)) { return resp.post(501, "forgotPassword.usernameNotExist", new String[] { username }); } if (!forgotUser.getEmail().equals(email)) { return resp.post(502, "forgotPassword.emailNotMatch"); } return null; } @Autowired private CaptchaService captchaService; @Autowired private MemberGroupService groupService; @Autowired private OrgService orgService; @Autowired private UserService userService; }