衡水精品网站建设价格本地搬家网站建设思路

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

衡水精品网站建设价格,本地搬家网站建设思路,哈尔滨网站建设oeminc,特价做网站目录 一、User类 二、ThreadLocal类
三、用户业务逻辑接口
四、用户业务逻辑接口实现类
五、用户控制层
六、用户登录拦截器
七、拦截器配置类
八、隐藏敏感信息的代码调整 完整的项目资源共享地址#xff0c;当中包含了代码、资源文件以及Nginx#xff08;Wi…目录 一、User类 二、ThreadLocal类  三、用户业务逻辑接口  四、用户业务逻辑接口实现类  五、用户控制层  六、用户登录拦截器  七、拦截器配置类  八、隐藏敏感信息的代码调整  完整的项目资源共享地址当中包含了代码、资源文件以及NginxWindows版和完整的配置 链接https://pan.quark.cn/s/5c28484d7882 提取码cJxQ 其中对于短信登录这块代码已经做了优化通过Redis实现短信验证码登录想要按照Session方式进行登录来学习Session的短信验证码登录流程的可以将工程相关代码按下述的代码进行修改调整。  一、User类 package com.hmdp.entity;import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; import java.time.LocalDateTime;Data EqualsAndHashCode(callSuper false) Accessors(chain true) TableName(tb_user) public class User implements Serializable {private static final long serialVersionUID 1L;/*** 主键/TableId(value id, type IdType.AUTO)private Long id;/** 手机号码/private String phone;/** 密码加密存储/private String password;/** 昵称默认是随机字符/private String nickName;/** 用户头像/private String icon ;/** 创建时间/private LocalDateTime createTime;/** 更新时间/private LocalDateTime updateTime;}二、ThreadLocal类  package com.hmdp.utils;import com.hmdp.entity.User;public class UserHolder {private static final ThreadLocalUser tl new ThreadLocal();public static void saveUser(User user){tl.set(user);}public static User getUser(){return tl.get();}public static void removeUser(){tl.remove();} }三、用户业务逻辑接口  package com.hmdp.service;import com.baomidou.mybatisplus.extension.service.IService; import com.hmdp.dto.LoginFormDTO; import com.hmdp.dto.Result; import com.hmdp.entity.User;import javax.servlet.http.HttpSession;public interface IUserService extends IServiceUser {Result sendCode(String phone, HttpSession session);Result login(LoginFormDTO loginForm, HttpSession session); }四、用户业务逻辑接口实现类  package com.hmdp.service.impl;import cn.hutool.core.util.RandomUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.hmdp.dto.LoginFormDTO; import com.hmdp.dto.Result; import com.hmdp.entity.User; import com.hmdp.mapper.UserMapper; import com.hmdp.service.IUserService; import com.hmdp.utils.RegexUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.servlet.http.HttpSession; import static com.hmdp.utils.SystemConstants.USER_NICK_NAME_PREFIX;Slf4j Service public class UserServiceImpl extends ServiceImplUserMapper, User implements IUserService {Resourceprivate StringRedisTemplate stringRedisTemplate;Overridepublic Result sendCode(String phone, HttpSession session) {// 1.校验手机号if (RegexUtils.isPhoneInvalid(phone)) {// 2.如果不符合返回错误信息return Result.fail(手机号格式错误);}// 3.符合生成验证码String code RandomUtil.randomNumbers(6);// 4.保存验证码到 sessionsession.setAttribute(code: phone, code);// 5.发送验证码log.debug(发送短信验证码成功验证码{}, code);// 返回okreturn Result.ok();}Overridepublic Result login(LoginFormDTO loginForm, HttpSession session) {// 1.校验手机号String phone loginForm.getPhone();if (RegexUtils.isPhoneInvalid(phone)) {// 2.如果不符合返回错误信息return Result.fail(手机号格式错误);}// 2. 校验验证码Object cacheCode session.getAttribute(code: loginForm.getPhone());String code loginForm.getCode();// 3. 不一致则报错if (cacheCode null || !cacheCode.toString().equals(code)) {return Result.fail(验证码错误);}// 4. 一致则根据手机号查询用户User user query().eq(phone, phone).one();// 5. 判断用户是否存在if (user null) {// 6. 不存在则创建用户并保存createUserWithPhone(phone);}// 7. 保存用户信息到session中session.setAttribute(user, user);// 8.返回tokenreturn Result.ok();}private User createUserWithPhone(String phone) {// 1.创建用户User user new User();user.setPhone(phone);user.setNickName(USER_NICK_NAME_PREFIX RandomUtil.randomString(10));// 2.保存用户save(user);return user;} }五、用户控制层  package com.hmdp.controller;import com.hmdp.dto.Result; import com.hmdp.service.IUserInfoService; import com.hmdp.service.IUserService; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.servlet.http.HttpSession;Slf4j RestController RequestMapping(/user) public class UserController {Resourceprivate IUserService userService;/** 发送手机验证码/PostMapping(code)public Result sendCode(RequestParam(phone) String phone, HttpSession session) {// 发送短信验证码并保存验证码return userService.sendCode(phone, session);}/** 登录功能* param loginForm 登录参数包含手机号、验证码或者手机号、密码/PostMapping(/login)public Result login(RequestBody LoginFormDTO loginForm, HttpSession session){// 实现登录功能return userService.login(loginForm, session);}GetMapping(/me)public Result me(){// 获取当前登录的用户并返回User user UserHolder.getUser();return Result.ok(user);} } 六、用户登录拦截器  package com.hmdp.utils;import com.hmdp.entity.User; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;public class LoginInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 1. 获取SessionHttpSession session request.getSession();// 2. 获取session中的用户Object user session.getAttribute(user);// 3. 判断用户是否存在if (user null) {// 4. 不存在则拦截并返回401状态码response.setStatus(401);return false;}// 5. 存在则保存用户信息到ThreadLocalUserHolder.saveUser((User) user);return true;}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 移除用户UserHolder.removeUser();} }七、拦截器配置类  package com.hmdp.config;import com.hmdp.utils.LoginInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;Configuration public class MvcConfig implements WebMvcConfigurer {Overridepublic void addInterceptors(InterceptorRegistry registry) {// 登录拦截器registry.addInterceptor(new LoginInterceptor()).excludePathPatterns(/shop/,/voucher/,/shop-type/,/upload/,/blog/hot,/user/code,/user/login);} }八、隐藏敏感信息的代码调整  上述代码中存入Session中的用户信息涉及到了很多的敏感字段如手机号、密码等会有安全风险所以对代码优化如下 package com.hmdp.dto;import lombok.Data;Data public class UserDTO {private Long id;private String nickName;private String icon; }package com.hmdp.utils;import com.hmdp.dto.UserDTO;public class UserHolder {private static final ThreadLocalUserDTO tl new ThreadLocal();public static void saveUser(UserDTO user){tl.set(user);}public static UserDTO getUser(){return tl.get();}public static void removeUser(){tl.remove();} }package com.hmdp.controller;import com.hmdp.dto.LoginFormDTO; import com.hmdp.dto.Result; import com.hmdp.dto.UserDTO; import com.hmdp.service.IUserInfoService; import com.hmdp.service.IUserService; import com.hmdp.utils.UserHolder; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.; import javax.annotation.Resource; import javax.servlet.http.HttpSession;Slf4j RestController RequestMapping(/user) public class UserController {Resourceprivate IUserService userService;Resourceprivate IUserInfoService userInfoService;/*** 发送手机验证码/PostMapping(code)public Result sendCode(RequestParam(phone) String phone, HttpSession session) {// 发送短信验证码并保存验证码return userService.sendCode(phone, session);}/** 登录功能* param loginForm 登录参数包含手机号、验证码或者手机号、密码*/PostMapping(/login)public Result login(RequestBody LoginFormDTO loginForm, HttpSession session){// 实现登录功能return userService.login(loginForm, session);}GetMapping(/me)public Result me(){// 获取当前登录的用户并返回UserDTO user UserHolder.getUser();return Result.ok(user);} } package com.hmdp.utils;import com.hmdp.dto.UserDTO; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;public class LoginInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 1. 获取SessionHttpSession session request.getSession();// 2. 获取session中的用户Object user session.getAttribute(user);// 3. 判断用户是否存在if (user null) {// 4. 不存在则拦截并返回401状态码response.setStatus(401);return false;}// 5. 存在则保存用户信息到ThreadLocalUserHolder.saveUser((UserDTO) user);return true;}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 移除用户UserHolder.removeUser();} }