当前位置: 首页 > news >正文

网站建设专家cms网上企业名称预先核准系统

网站建设专家cms,网上企业名称预先核准系统,北京 一图看懂 最新,中装建设董事长从今天开始我们来写一个新项目#xff0c;这个项目是一个完整的校园论坛的项目。主要功能模块#xff1a;用户登录注册#xff0c;帖子发布和热帖排行#xff0c;点赞关注#xff0c;发送私信#xff0c;消息通知#xff0c;社区搜索等。这篇文章我们先试着写一下用户的…从今天开始我们来写一个新项目这个项目是一个完整的校园论坛的项目。主要功能模块用户登录注册帖子发布和热帖排行点赞关注发送私信消息通知社区搜索等。这篇文章我们先试着写一下用户的登录注册功能。 我们做web项目一般web项目是主要解决浏览器和服务器之间交互的问题。而浏览器和服务器是由一次一次的请求交互的。因此任何功能都可拆解成若干次请求其实只要掌握好每次请求的执行过程按照步骤开发每一次请求基本上项目就可以逐步完善起来。 一次请求的执行过程 其实最好是可以把功能做拆解第一步先实现什么效果第二步再完善这个效果。因为你不可能一下子就一步到位写出完整的代码的是吧 所以这就是我的思路我是想着一个功能一个功能的搞定。这篇文章来搞定用户登录注册。 用户登录注册功能说实话这个功能是真的比较复杂的所以我们必须把这个功能拆解成若干部分使得每部分都简单点易于开发。对于web项目来说每个功能都可以按照请求去拆解因为每个功能都是由若干个浏览器和服务器的请求交互所构成的。比如注册功能怎么访问和使用呢比如你首页点击“注册”这个链接就能打开注册的页面那这个很显然就是访问服务器就有一次请求只不过这次请求就是打开页面而已比较简单。第二个请求就是填写数据填账号密码邮箱这些然后点击“注册”按钮那么这个数据就会提交给服务器服务器就把这些数据存起来。之后服务器就会给你一个邮件邮件里面是链接你点击那个链接就可以激活账号了事实上你点链接也是访问服务器进行激活的服务。我们在写代码时还是按照DAO-Service-Controller来开发但是有些功能可能没有DAO层有些功能可能没有Service层这都很正常。比如第一次请求访问注册页面。你就访问个注册页面而已哪有什么业务什么访问数据库这些。 OK接下来就开始写了 用户注册登录模块大致结构 entity文件夹User.java LoginTicket.java DAO层UserMapper   LoginMapper Service层UserService Controller层LoginController entity文件夹---User.java 下面是entity文件夹下一个名为User.java的实体类文件。该文件定义了一个名为User的实体类用于表示用户的信息。 public class User {private int id; //用户的唯一标识符private String username; //用户的用户名用于登录和显示private String password; //用户的密码用于登录验证private String salt; //密码加密时使用的盐值增加密码的安全性private String email; //用户的电子邮件地址private int type; //用户类型用于区分不同类型的用户例如普通用户、管理员等private int status; //用户的状态表示用户的激活状态或禁用状态等private String activationCode; //用户的激活码用于激活帐户或进行身份验证private String headerUrl; //用户头像的URL地址private Date createTime; //用户创建的时间戳表示用户的注册时间或创建时间// 省略了getter和setter方法Overridepublic String toString() {return User{ id id , username username \ , password password \ , salt salt \ , email email \ , type type , status status , activationCode activationCode \ , headerUrl headerUrl \ , createTime createTime };}} 这个实体类主要用于封装用户相关的信息并在系统中进行传递和处理。它可以作为数据库表的映射实体类也可以用于数据传输和业务逻辑操作。 entity文件夹---LoginTicket.java 下面是entity文件夹下一个名为LoginTicket.java的实体类文件。该文件定义了一个名为LoginTicket的实体类用于表示登录凭证的信息。 对于用户登录凭证我之前一直搞不懂所以就查百度感觉有一个例子很好的解释了什么是吧用户登录凭证我分享给大家 假设有一个在线购物网站用户在该网站上注册账号并进行购物。当用户想要登录到他们的账号时他们需要提供用户名和密码。在成功验证用户名和密码后网站会颁发给用户一个登录凭证。 在这个例子中登录凭证可以是一个唯一的令牌或会话ID。这个凭证会与用户的账号进行关联并在用户的浏览器中存储为一个Cookie或其他形式的标识。 用户在登录凭证的帮助下在一段时间内可以访问网站的受限资源如个人购物车、订单历史记录等。每当用户访问需要身份验证的页面时他们的凭证将被检查以验证其身份和权限。如果凭证有效且与用户账号匹配用户将被授权访问相应的资源。 在此过程中登录凭证充当了用户的身份标识用于验证用户的身份并授权其访问网站的特定功能和信息。凭证的生成和验证是网站实现用户认证和会话管理的重要部分。 需要注意的是每次用户登录时会生成一个新的登录凭证并在一段时间后过期。这样可以提高系统的安全性并确保用户的身份唯一性。 package com.nowcoder.community.entity;import java.util.Date;public class LoginTicket {private int id; //登录凭证的唯一标识符private int userId; //与登录凭证相关联的用户的IDprivate String ticket; //登录凭证的字符串值private int status; //登录凭证的状态表示凭证的有效性或失效状态private Date expired; //登录凭证的过期时间表示凭证的有效期限// 省略了getter和setter方法Overridepublic String toString() {return LoginTicket{ id id , userId userId , ticket ticket \ , status status , expired expired };} }这些属性太晦涩了我举个例子帮助大家理解。 id假设用户A在登录后生成了一个登录凭证系统为该凭证分配了一个唯一的ID比如1。userId用户A的ID是123这个属性将与用户A的ID关联起来表示登录凭证与用户A的关联。ticket系统生成了一个字符串作为登录凭证比如abc123这个字符串将在用户登录时颁发给用户A。status登录凭证的状态属性用于标识凭证的有效性。比如0表示凭证失效1表示凭证有效。expired登录凭证的过期时间比如2024-03-01 00:00:00表示凭证在这个时间之后将失效。 DAO层---UserMapper 下面的代码是一个名为UserMapper的数据访问对象DAO接口用于与用户数据进行交互。该接口使用MyBatis注解进行映射用于定义与用户数据相关的数据库操作方法。 Mapper public interface UserMapper {User selectById(int id);//根据用户ID查询用户信息并返回一个User对象User selectByName(String username);//根据用户名查询用户信息并返回一个User对象User selectByEmail(String email);//根据电子邮件地址查询用户信息并返回一个User对象int insertUser(User user);//插入一个新用户的信息并返回插入的行数int updateStatus(int id, int status);//更新用户的状态信息例如激活状态并返回更新的行数int updateHeader(int id, String headerUrl);//更新用户的头像URL信息并返回更新的行数int updatePassword(int id, String password);//更新用户的密码信息并返回更新的行数} 返回更新的行数是指在执行数据库更新操作后影响到的数据库行数。例如如果执行更新操作后返回的值为1则表示成功更新了一行数据。 DAO层---LoginTicketMapper 下面的代码是一个名为LoginTicketMapper的数据访问对象DAO接口用于与登录凭证数据进行交互。该接口使用了MyBatis的注解来定义与数据库的交互操作。 Mapper Deprecated public interface LoginTicketMapper {Insert({insert into login_ticket(user_id,ticket,status,expired) ,values(#{userId},#{ticket},#{status},#{expired})})Options(useGeneratedKeys true, keyProperty id)int insertLoginTicket(LoginTicket loginTicket); //向数据库中插入一条登录凭证的信息并返回插入的行数。使用了Insert注解定义了插入操作的SQL语句Select({select id,user_id,ticket,status,expired ,from login_ticket where ticket#{ticket}})LoginTicket selectByTicket(String ticket); //根据登录凭证的字符串ticket从数据库中查询对应的登录凭证信息并返回一个LoginTicket对象。使用了Select注解定义了查询操作的SQL语句。Update({script,update login_ticket set status#{status} where ticket#{ticket} ,if test\ticket!null\ ,and 11 ,/if,/script})int updateStatus(String ticket, int status); //根据登录凭证的字符串ticket更新对应登录凭证的状态信息并返回更新的行数。使用了Update注解定义了更新操作的SQL语句。} Service层---UserService 下面的代码名叫UserService其中包含了用户注册、登录、激活、注销等功能的实现。 Service public class UserService implements CommunityConstant {//省略了一些导入包和导入依赖项的代码直接写方法public User findUserById(int id) { // return userMapper.selectById(id);User user getCache(id);if (user null) {user initCache(id);}return user;}public MapString, Object register(User user) {MapString, Object map new HashMap();// 空值处理if (user null) {throw new IllegalArgumentException(参数不能为空!);}if (StringUtils.isBlank(user.getUsername())) {map.put(usernameMsg, 账号不能为空!);return map;}if (StringUtils.isBlank(user.getPassword())) {map.put(passwordMsg, 密码不能为空!);return map;}if (StringUtils.isBlank(user.getEmail())) {map.put(emailMsg, 邮箱不能为空!);return map;}// 验证账号User u userMapper.selectByName(user.getUsername());if (u ! null) {map.put(usernameMsg, 该账号已存在!);return map;}// 验证邮箱u userMapper.selectByEmail(user.getEmail());if (u ! null) {map.put(emailMsg, 该邮箱已被注册!);return map;}// 注册用户user.setSalt(CommunityUtil.generateUUID().substring(0, 5));user.setPassword(CommunityUtil.md5(user.getPassword() user.getSalt()));user.setType(0);user.setStatus(0);user.setActivationCode(CommunityUtil.generateUUID());user.setHeaderUrl(String.format(http://images.nowcoder.com/head/%dt.png, new Random().nextInt(1000)));user.setCreateTime(new Date());userMapper.insertUser(user);// 激活邮件Context context new Context();context.setVariable(email, user.getEmail());// http://localhost:8080/community/activation/101/codeString url domain contextPath /activation/ user.getId() / user.getActivationCode();context.setVariable(url, url);String content templateEngine.process(/mail/activation, context);mailClient.sendMail(user.getEmail(), 激活账号, content);return map;}public int activation(int userId, String code) {User user userMapper.selectById(userId);if (user.getStatus() 1) {return ACTIVATION_REPEAT;} else if (user.getActivationCode().equals(code)) {userMapper.updateStatus(userId, 1);clearCache(userId);return ACTIVATION_SUCCESS;} else {return ACTIVATION_FAILURE;}}public MapString, Object login(String username, String password, long expiredSeconds) {MapString, Object map new HashMap();// 空值处理if (StringUtils.isBlank(username)) {map.put(usernameMsg, 账号不能为空!);return map;}if (StringUtils.isBlank(password)) {map.put(passwordMsg, 密码不能为空!);return map;}// 验证账号User user userMapper.selectByName(username);if (user null) {map.put(usernameMsg, 该账号不存在!);return map;}// 验证状态if (user.getStatus() 0) {map.put(usernameMsg, 该账号未激活!);return map;}// 验证密码password CommunityUtil.md5(password user.getSalt());if (!user.getPassword().equals(password)) {map.put(passwordMsg, 密码不正确!);return map;}// 生成登录凭证LoginTicket loginTicket new LoginTicket();loginTicket.setUserId(user.getId());loginTicket.setTicket(CommunityUtil.generateUUID());loginTicket.setStatus(0);loginTicket.setExpired(new Date(System.currentTimeMillis() expiredSeconds * 1000)); // loginTicketMapper.insertLoginTicket(loginTicket);String redisKey RedisKeyUtil.getTicketKey(loginTicket.getTicket());redisTemplate.opsForValue().set(redisKey, loginTicket);map.put(ticket, loginTicket.getTicket());return map; }public void logout(String ticket) { // loginTicketMapper.updateStatus(ticket, 1);String redisKey RedisKeyUtil.getTicketKey(ticket);LoginTicket loginTicket (LoginTicket) redisTemplate.opsForValue().get(redisKey);loginTicket.setStatus(1);redisTemplate.opsForValue().set(redisKey, loginTicket);}public LoginTicket findLoginTicket(String ticket) { // return loginTicketMapper.selectByTicket(ticket);String redisKey RedisKeyUtil.getTicketKey(ticket);return (LoginTicket) redisTemplate.opsForValue().get(redisKey);}public int updateHeader(int userId, String headerUrl) { // return userMapper.updateHeader(userId, headerUrl);int rows userMapper.updateHeader(userId, headerUrl);clearCache(userId);return rows;}public User findUserByName(String username) {return userMapper.selectByName(username);}// 1.优先从缓存中取值private User getCache(int userId) {String redisKey RedisKeyUtil.getUserKey(userId);return (User) redisTemplate.opsForValue().get(redisKey);}// 2.取不到时初始化缓存数据private User initCache(int userId) {User user userMapper.selectById(userId);String redisKey RedisKeyUtil.getUserKey(userId);redisTemplate.opsForValue().set(redisKey, user, 3600, TimeUnit.SECONDS);return user;}// 3.数据变更时清除缓存数据private void clearCache(int userId) {String redisKey RedisKeyUtil.getUserKey(userId);redisTemplate.delete(redisKey);}public Collection? extends GrantedAuthority getAuthorities(int userId) {User user this.findUserById(userId);ListGrantedAuthority list new ArrayList();list.add(new GrantedAuthority() {Overridepublic String getAuthority() {switch (user.getType()) {case 1:return AUTHORITY_ADMIN;case 2:return AUTHORITY_MODERATOR;default:return AUTHORITY_USER;}}});return list;}} 实现了findUserById方法根据用户ID查找用户信息。在这个方法中首先尝试从缓存中获取用户信息如果缓存中没有则从数据库中查询并将结果存入缓存中。实现了register方法用于用户注册。在这个方法中首先进行参数的空值处理和账号、邮箱的验证。然后设置用户的一些属性如盐值、密码加密、激活码等并将用户信息插入数据库中。最后发送激活邮件给用户。实现了activation方法用于用户账号激活。根据传入的用户ID和激活码验证用户的激活状态和激活码是否匹配如果匹配则更新用户状态为已激活并清除缓存中的用户信息。实现了login方法用户用户登录。在这个方法中首先进行参数的空值处理和账号、密码的验证。然后验证账号的状态和密码的正确性。最后生成登录凭证LoginTicket将凭证信息存入Redis中并返回给客户端。实现了logout方法用户用户注销。根据传入的登录凭证将凭证的状态更新为已注销并在Redis中更新相应的信息。实现了findLoginTicket方法根据登录凭证查找登录凭证的信息。实现了updateHeader方法用于更新用户的头像信息。在更新用户头像后清除缓存中的用户信息。实现了findUserByName方法根据用户名查找用户信息。实现了getCache方法用于从缓存中获取用户信息。实现了initCache方法用于初始化缓存中的用户信息。实现了clearCache方法用于清除缓存中的用户信息。实现了getAuthorities方法用于获取用户的权限信息这就是展示了一个用户登录注册功能中用户服务类的实现涵盖了用户注册、登录、激活、注销等功能并使用了缓存和Redis存储登录凭证的信息。 Controller层---LoginController Controller public class LoginController implements CommunityConstant {//省略了一些配置依赖关系的的代码RequestMapping(path /register, method RequestMethod.GET)public String getRegisterPage() {return /site/register;}RequestMapping(path /login, method RequestMethod.GET)public String getLoginPage() {return /site/login;}RequestMapping(path /register, method RequestMethod.POST)public String register(Model model, User user) {MapString, Object map userService.register(user);if (map null || map.isEmpty()) {model.addAttribute(msg, 注册成功,我们已经向您的邮箱发送了一封激活邮件,请尽快激活!);model.addAttribute(target, /index);return /site/operate-result;} else {model.addAttribute(usernameMsg, map.get(usernameMsg));model.addAttribute(passwordMsg, map.get(passwordMsg));model.addAttribute(emailMsg, map.get(emailMsg));return /site/register;}}// http://localhost:8080/community/activation/101/codeRequestMapping(path /activation/{userId}/{code}, method RequestMethod.GET)public String activation(Model model, PathVariable(userId) int userId, PathVariable(code) String code) {int result userService.activation(userId, code);if (result ACTIVATION_SUCCESS) {model.addAttribute(msg, 激活成功,您的账号已经可以正常使用了!);model.addAttribute(target, /login);} else if (result ACTIVATION_REPEAT) {model.addAttribute(msg, 无效操作,该账号已经激活过了!);model.addAttribute(target, /index);} else {model.addAttribute(msg, 激活失败,您提供的激活码不正确!);model.addAttribute(target, /index);}return /site/operate-result;}RequestMapping(path /kaptcha, method RequestMethod.GET)public void getKaptcha(HttpServletResponse response/*, HttpSession session*/) {// 生成验证码String text kaptchaProducer.createText();BufferedImage image kaptchaProducer.createImage(text);// 将验证码存入session// session.setAttribute(kaptcha, text);// 验证码的归属String kaptchaOwner CommunityUtil.generateUUID();Cookie cookie new Cookie(kaptchaOwner, kaptchaOwner);cookie.setMaxAge(60);cookie.setPath(contextPath);response.addCookie(cookie);// 将验证码存入RedisString redisKey RedisKeyUtil.getKaptchaKey(kaptchaOwner);redisTemplate.opsForValue().set(redisKey, text, 60, TimeUnit.SECONDS);// 将突图片输出给浏览器response.setContentType(image/png);try {OutputStream os response.getOutputStream();ImageIO.write(image, png, os);} catch (IOException e) {logger.error(响应验证码失败: e.getMessage());}}RequestMapping(path /login, method RequestMethod.POST)public String login(String username, String password, String code, boolean rememberme,Model model, /*HttpSession session, */HttpServletResponse response,CookieValue(kaptchaOwner) String kaptchaOwner) {// 检查验证码// String kaptcha (String) session.getAttribute(kaptcha);String kaptcha null;if (StringUtils.isNotBlank(kaptchaOwner)) {String redisKey RedisKeyUtil.getKaptchaKey(kaptchaOwner);kaptcha (String) redisTemplate.opsForValue().get(redisKey);}if (StringUtils.isBlank(kaptcha) || StringUtils.isBlank(code) || !kaptcha.equalsIgnoreCase(code)) {model.addAttribute(codeMsg, 验证码不正确!);return /site/login;}// 检查账号,密码int expiredSeconds rememberme ? REMEMBER_EXPIRED_SECONDS : DEFAULT_EXPIRED_SECONDS;MapString, Object map userService.login(username, password, expiredSeconds);if (map.containsKey(ticket)) {Cookie cookie new Cookie(ticket, map.get(ticket).toString());cookie.setPath(contextPath);cookie.setMaxAge(expiredSeconds);response.addCookie(cookie);return redirect:/index;} else {model.addAttribute(usernameMsg, map.get(usernameMsg));model.addAttribute(passwordMsg, map.get(passwordMsg));return /site/login;}}RequestMapping(path /logout, method RequestMethod.GET)public String logout(CookieValue(ticket) String ticket) {userService.logout(ticket);SecurityContextHolder.clearContext();return redirect:/login;}} 这段代码也是很长狗屎一样我就简单说说这段代码大概的意思吧。 这段代码中使用了UserService来处理用户相关的业务逻辑使用了Producer来生成验证码图片以及使用了RedisTemplate来操作Redis数据库。 /register和/login这两个GET请求的处理方法返回注册页面和登录页面的视图。 /registerPOST请求该方法处理用户注册的请求。根据用户提供的信息进行注册并返回相应的结果。如果注册成功会向用户的邮箱发送一封激活邮件。 /activation/{userId}/{code}GET请求该方法处理用户账号激活的请求。通过传入的userId和code参数进行账号激活并返回相应的结果。 /kaptchaGET请求该方法生成验证码图片并将验证码存入Redis和浏览器的Cookie中以便后续验证。 /loginPOST请求该方法处理用户登录的请求。首先检查验证码的正确性然后根据用户提供的用户名和密码进行登录。如果登录成功会生成一个ticket凭证并将凭证存入浏览器的Cookie中并重定向到首页。 /logoutGET请求该方法处理用户退出登录的请求。清除用户的登录凭证ticket并重定向到登录页面。
http://www.zqtcl.cn/news/516414/

相关文章:

  • 怎么入侵网站后台互联网营销师含金量
  • 网站建设ningqueseo济南网站建设服务
  • 做网站给女朋友品牌网站建设只询大蝌蚪
  • 厦门服装商城网站建设米课做网站
  • ui做网站实例一起做网店网站官方
  • 网站建设合同怎么写wordpress如何设置404页面
  • wordpress 安装过程顺德网站优化
  • 大麦网网站建设的功能定位wordpress图片不被收录
  • 做推广任务的网站渠道营销推广方案
  • 消防中队网站建设施工企业项目经理部管理人员对外行为的法律后果
  • 淘宝的网站建设情况仪器网站模板
  • 网站开发需要掌握的知识什么软件是做网站模板的
  • wap网站管理系统wordpress评论分页不显示不出来
  • 泗阳住房建设局网站泉州网站建设工程
  • 陕西省住房城乡建设部门户网站做百度移动端网站软件
  • 濮阳公司建站怎么自己做网站app
  • 美辰网站建设个人网站如何做移动端
  • 郑州模板网站建设网页在线代理
  • 学生做网站的工作室网站建设项目表
  • .net网站开发教程百度贴吧微网站设计基本要求
  • 无锡网站建设哪家公司好咨询网站建设
  • 优秀的企业网站设计wordpress登陆后台总是跳转首页
  • 国外html5特效网站宁波江北区建设局网站
  • 购物网站哪个是正品商城网站模板下载
  • 网站名称 规则技术支持 石家庄网站建设
  • 专门做私人定制旅游的网站专做韩餐网站
  • 网站 续费wordpress首页调用指定分类
  • 2008系统怎么做网站免费设计软件下载
  • 做电音的软件的专业下载网站宁波俄语网站建设
  • 北?? 网站建设旅游手机网站开发