深圳网站建设公司企业,什么是网络工程师,广州 建设 招聘信息网站,网站审批需要什么手续MVC拦截器、ThreadLocal来进行登录拦截 1. 对登录进行拦截1.1 什么是ThreadLocal1.2 定义UserHolder 类#xff0c;来封装ThreadLocal方法1.3 拦截器WebMvcConfigurer 的配置1.4 登录的配置#xff0c;当碰到拦截的方法的时候调用1.5 UserServiceImpl1.6 controller#xff… MVC拦截器、ThreadLocal来进行登录拦截 1. 对登录进行拦截1.1 什么是ThreadLocal1.2 定义UserHolder 类来封装ThreadLocal方法1.3 拦截器WebMvcConfigurer 的配置1.4 登录的配置当碰到拦截的方法的时候调用1.5 UserServiceImpl1.6 controller 1. 对登录进行拦截
1.1 什么是ThreadLocal
ThreadLocal叫做线程变量意思是ThreadLocal中填充的变量属于当前线程该变量对其他线程而言是隔离的也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本那么每个线程可以访问自己内部的副本变量。 详细可以看https://blog.csdn.net/u010445301/article/details/111322569
1.2 定义UserHolder 类来封装ThreadLocal方法
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();}
}
1.3 拦截器WebMvcConfigurer 的配置
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(//放行的接口/blog/hot,/shop/**,/upload/**,/voucher/**,/shop-type/**,/user/code,/user/login);}
}
1.4 登录的配置当碰到拦截的方法的时候调用
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);/*session.setAttribute(sessionName,Object); //保存//用来设置session值的sessionName是名称object是你要保存的对象。session.getAttribute(sessionName); //取得//用来得到对应名称的session值即得到object对象注意需要进行类型转换
*///3.判断用户是否存在if (user null) {//4.不存在拦截 返回401状态码 未授权的意思response.setStatus(401);return false;}//5.存在保存到ThreadLocal 对ThreadLocal进行了规范和重写。UserHolder.saveUser((UserDTO)user);//把user保存到ThreadLocal对user进行强转//6.放行return true;}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {UserHolder.removeUser();//移除用户}
}1.5 UserServiceImpl
package com.hmdp.service.impl;import cn.hutool.core.bean.BeanUtil;
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.dto.UserDTO;
import com.hmdp.entity.User;
import com.hmdp.mapper.UserMapper;
import com.hmdp.service.IUserService;
import com.hmdp.utils.RegexUtils;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import javax.servlet.http.HttpSession;/*** p* 服务实现类* /p** author 虎哥* since 2021-12-22*/
Service
public class UserServiceImpl extends ServiceImplUserMapper, User implements IUserService {Overridepublic Result sendCode(String phone, HttpSession session) {//1.校验手机号if (RegexUtils.isPhoneInvalid(phone)){//RegexUtils去校验手机号是否无效再utils中//2.如果不符合返回错误信息return Result.fail(手机号格式错误);}//3.符合生成验证码String code RandomUtil.randomNumbers(6);//生成一个6位的随机数字验证码//4.保存验证码到sessionsession.setAttribute(code,code);//5.发送验证码如果我们要发送短信的话需要通过第三方平台比如阿里云之类的所以我们直接使用log日志输出log.debug(发送短信验证码成功验证码 code);//返回okreturn Result.ok();}Overridepublic Result login(LoginFormDTO loginForm, HttpSession session) {//1.校验手机号//因为我们需要确定登录的时候手机号还是不是一个String phone loginForm.getPhone();if (RegexUtils.isPhoneInvalid(phone)){//RegexUtils去校验手机号是否无效再utils中//2.如果不符合返回错误信息return Result.fail(手机号格式错误);}//2.校验验证码Object CacheCode session.getAttribute(code);String code loginForm.getCode();if (CacheCodenull||!CacheCode.toString().equals(code)){//3.不一致报错return Result.fail(验证码错误);}//4.一致根据手机号查询用户 select * from tb_user where phone ? query,因为我们在这个类上面extends ServiceImplUserMapper, User所以可以使用mybatisPlusUser user query().eq(phone, phone).one();//one()是查询一个如果查询不到返回null//5.判断用户是否存在if (user null) {//6.不存在创建新用户保存user creteUserWithPhone(phone);}//7.保存用户信息到sessionsession.setAttribute(User, BeanUtil.copyProperties(user, UserDTO.class));//将user对象转换成UserDTO对象再保存到session中return Result.ok();}//每一个session都有一个sessionid当我们访问tomcat的时候就已经自动带着了所以又sessionId就能知道是哪个用户private User creteUserWithPhone(String phone) {//1.创建用户User user new User();user.setPhone(phone);user.setNickName(User_RandomUtil.randomString(10));//2.保存用户save(user);return user;}
}
1.6 controller
package com.hmdp.controller;import com.hmdp.dto.LoginFormDTO;
import com.hmdp.dto.Result;
import com.hmdp.dto.UserDTO;
import com.hmdp.entity.UserInfo;
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;/*** p* 前端控制器* /p** author 虎哥* since 2021-12-22*/
Slf4j
RestController
RequestMapping(/user)
public class UserController {Resourceprivate IUserService userService;Resourceprivate IUserInfoService userInfoService;/*** 发送手机验证码*/PostMapping(code)public Result sendCode(RequestParam(phone) String phone, HttpSession session) {// TODO 发送短信验证码并保存验证码return userService.sendCode(phone,session);//因为我们的短信验证码要保存在session当中}/*** 登录功能* param loginForm 登录参数包含手机号、验证码或者手机号、密码*/PostMapping(/login)public Result login(RequestBody LoginFormDTO loginForm, HttpSession session){// 实现登录功能return userService.login(loginForm,session);}/*** 登出功能* return 无*/PostMapping(/logout)public Result logout(){// TODO 实现登出功能return Result.fail(功能未完成);}GetMapping(/me)public Result me(){// 获取当前登录的用户并返回UserDTO user UserHolder.getUser();return Result.ok((UserDTO)user);}GetMapping(/info/{id})public Result info(PathVariable(id) Long userId){// 查询详情UserInfo info userInfoService.getById(userId);if (info null) {// 没有详情应该是第一次查看详情return Result.ok();}info.setCreateTime(null);info.setUpdateTime(null);// 返回return Result.ok(info);}
}