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

引流app推广软件seo店铺描述例子

引流app推广软件,seo店铺描述例子,邢台网站开发,ppt模板免费版项目介绍 导入黑马点评项目 项目架构 基于Session实现登录 基本流程 实现发送短信验证码功能 controller层中 /*** 发送手机验证码*/PostMapping("code")public Result sendCode(RequestParam("phone") String phone, HttpSession session) {// 发送短信…

项目介绍

导入黑马点评项目

项目架构

 

 

基于Session实现登录

基本流程

实现发送短信验证码功能

 controller层中

    /*** 发送手机验证码*/@PostMapping("code")public Result sendCode(@RequestParam("phone") String phone, HttpSession session) {//  发送短信验证码并保存验证码return userService.sendCode(phone,session);}

Service层中

真的发送的话要接入阿里云或腾讯云的短信发送功能,这里假装发送成功。

@Slf4j
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {@Overridepublic Result sendCode(String phone, HttpSession session) {//1.校验手机号if(RegexUtils.isPhoneInvalid(phone)){//2.如果不符合,返回错误信息return Result.fail("手机号格式错误!");}//3.符合,生成验证码String code = RandomUtil.randomNumbers(6);//4.保存验证码session.setAttribute("code",code);//5.发送验证码log.debug("发送短信验证码成功,验证码:{}",code);return Result.ok();}
}

再次点击发送就可以看见如下:

 

实现验证码登录和注册功能

Controller层中

    /*** 登录功能* @param loginForm 登录参数,包含手机号、验证码;或者手机号、密码*/@PostMapping("/login")public Result login(@RequestBody LoginFormDTO loginForm, HttpSession session){// 实现登录功能return userService.login(loginForm,session);}

Service层中

    @Overridepublic Result login(LoginFormDTO loginForm, HttpSession session) {//1.验证手机号String phone=loginForm.getPhone();if(RegexUtils.isPhoneInvalid(phone)){//1.1不符合,返回报错return Result.fail("手机号格式错误!");}//2.校验验证码Object cacheCode = session.getAttribute("code");String code = loginForm.getCode();if(cacheCode==null||!cacheCode.toString().equals(code)){//3.不一致,报错return Result.fail("验证码错误");}//4.一致,根据手机号查询用户 select * from tb_user where phone=?User user = query().eq("phone", phone).one();//5.判断用户是否存在if(user==null){//6.不存在,创建新用户并保存user=   createUserWithPhone(phone);}//7.存在,保存用户信息到session中session.setAttribute("user",user);return 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;}

这里的session之所以能够获取到发送验证码请求时存入的验证码是因为这是在同一个会话当中,session会被返回给前端,下一次请求也会携带同一个session过来。所以才有之前保存的信息在里面。

实现登录校验拦截器

 

 接口多了之后就要拦截器进行统一校验,然后为了传递用户信息给后序的业务,需要将用户信息存入Threadlocal里面的.Threadlocal是每个请求线程的一个独立保存空间。

在拦截器的最后一个方法中,清空thread local的信息,第一可以做到退出登录,第二可以防止内存泄露

新建一个拦截器

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.不存在,拦截response.setStatus(401);return false;}//5.存在,保存用户信息到ThreadLocalUserHolder.saveUser((UserDTO) user);//6.放行return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//移除用户UserHolder.removeUser();}
}

 新建配置项

将上面的拦截器投入使用,并且指定不拦截的请求。

@Configuration
public class MvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).excludePathPatterns("/shop/**","/shop-type/**","/upload/**","/blog/hot","/user/code" ,"/user/login");}
}

登录校验接口

    @GetMapping("/me")public Result me(){// 获取当前登录的用户并返回UserDTO user= UserHolder.getUser();return Result.ok(user);}

隐藏用户敏感信息

在前面代码里返回给前端的是用户完整信息,这是不合理的,所以改成如下。

在session存的时候就只存部分信息。然后上面登录校验逻辑因为黑马资料的问题已经是隐藏之后的了的,所以只改这里一个地方即可。

    @Overridepublic Result login(LoginFormDTO loginForm, HttpSession session) {........//7.存在,保存用户信息到session中session.setAttribute("user", BeanUtil.copyProperties(user, UserDTO.class));return Result.ok();}

集群的session共享问题

使用Redis解决Session共享问题。 

基于Redis实现共享session登录

业务流程

基于redis实现短信登录

发送短信验证码部分的代码修改:

生成验证码之后将验证码存入Redis

    @Resourceprivate StringRedisTemplate stringRedisTemplate;@Overridepublic Result sendCode(String phone, HttpSession session) {//1.校验手机号...//3.符合,生成验证码...//4.保存验证码到RedisstringRedisTemplate.opsForValue().set("login:code:"+phone,code,2, TimeUnit.MINUTES);//5.发送验证码...}

短信验证码登录,注册功能部分的代码修改:

    @Overridepublic Result login(LoginFormDTO loginForm, HttpSession session) {//1.验证手机号...//  2.从redis获取 校验验证码String cacheCode = stringRedisTemplate.opsForValue().get(LOGIN_CODE_KEY+phone);...//4.一致,根据手机号查询用户 select * from tb_user where phone=?...//5.判断用户是否存在...//7.存在,保存用户信息到Redis中//7.1.随机生成token,作为登录令牌String token = UUID.randomUUID().toString(true);//7.2将User对象转为Hash存储UserDTO userDTO=BeanUtil.copyProperties(user, UserDTO.class);Map<String, Object> userMap = BeanUtil.beanToMap(userDTO);//7.3存储String tokenKey="login::token:"+token;stringRedisTemplate.opsForHash().putAll(tokenKey,userMap);//7.4设置token有效期stringRedisTemplate.expire(tokenKey,30,TimeUnit.MINUTES);//8.返回tokenreturn Result.ok(token);}

登录拦截器代码修改


public class LoginInterceptor implements HandlerInterceptor {private StringRedisTemplate stringRedisTemplate;public LoginInterceptor(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate=stringRedisTemplate;}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//1.获取请求头中的tokenString token = request.getHeader("authorization");if (StrUtil.isBlank(token)) {//4.不存在,拦截response.setStatus(401);return false;}//2.基于token获取redis中的用户String tokenKey=RedisConstants.LOGIN_USER_KEY + token;Map<Object, Object> userMap = stringRedisTemplate.opsForHash().entries(tokenKey);//3.判断用户是否存在if(userMap.isEmpty()){//4.不存在,拦截response.setStatus(401);return false;}//5.将查询到的Hash数据转为UserDTO对象UserDTO userDTO = BeanUtil.fillBeanWithMap(userMap, new UserDTO(), false);//6.存在,保存用户信息到ThreadLocalUserHolder.saveUser( userDTO);//7.刷新token有效期stringRedisTemplate.expire(tokenKey,RedisConstants.CACHE_SHOP_TTL, TimeUnit.MINUTES);//8.放行return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//移除用户...}
}

因为这里不能用注解注入stringRedisTemplate,要在MVC配置器哪里进行注入

@Configuration
public class MvcConfig implements WebMvcConfigurer {@Resourceprivate StringRedisTemplate stringRedisTemplate;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor(stringRedisTemplate)).excludePathPatterns("/shop/**","/shop-type/**","/upload/**","/blog/hot","/user/code" ,"/user/login");}
}

出现Long转String的报错 

在登录逻辑里面将对象转为Map时做多点工作

        //7.2将User对象转为Hash存储UserDTO userDTO=BeanUtil.copyProperties(user, UserDTO.class);Map<String, Object> userMap = BeanUtil.beanToMap(userDTO,new HashMap<>(),CopyOptions.create().setIgnoreNullValue(true).setFieldValueEditor((fieldName,fieldValue)->fieldValue.toString()));

 可以看见对应东西

 

解决登录状态刷新问题

登录状态的刷新只会在访问需要拦截的请求时才刷新,如果是不需要拦截的请求就不会刷新.

为了拦截所有请求,这里新加一个拦截器

新增刷新拦截器:

public class RefreshTokenInterceptor implements HandlerInterceptor {private StringRedisTemplate stringRedisTemplate;public RefreshTokenInterceptor(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate=stringRedisTemplate;}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//1.获取请求头中的tokenString token = request.getHeader("authorization");if (StrUtil.isBlank(token)) {return true;}//2.基于token获取redis中的用户String tokenKey=RedisConstants.LOGIN_USER_KEY + token;Map<Object, Object> userMap = stringRedisTemplate.opsForHash().entries(tokenKey);//3.判断用户是否存在if(userMap.isEmpty()){return true;}//5.将查询到的Hash数据转为UserDTO对象UserDTO userDTO = BeanUtil.fillBeanWithMap(userMap, new UserDTO(), false);//6.存在,保存用户信息到ThreadLocalUserHolder.saveUser( userDTO);//7.刷新token有效期stringRedisTemplate.expire(tokenKey,RedisConstants.CACHE_SHOP_TTL, TimeUnit.MINUTES);//8.放行return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//移除用户UserHolder.removeUser();}
}

 修改原本的登录拦截器

public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//1.判断是否需要拦截(ThreadLocal中是否有用户)if(UserHolder.getUser()==null){//没有,需要拦截response.setStatus(401);return false;}return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//移除用户UserHolder.removeUser();}
}

MVC配置类当中

需要添加order保证刷新拦截器先执行。

@Configuration
public class MvcConfig implements WebMvcConfigurer {@Resourceprivate StringRedisTemplate stringRedisTemplate;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//登录拦截器registry.addInterceptor(new LoginInterceptor()).excludePathPatterns("/shop/**","/shop-type/**","/upload/**","/blog/hot","/user/code" ,"/user/login").order(1);//刷新拦截器registry.addInterceptor(new RefreshTokenInterceptor(stringRedisTemplate)).addPathPatterns("/**").order(0);}
}


文章转载自:
http://wolf.c7630.cn
http://thermoammeter.c7630.cn
http://advisable.c7630.cn
http://commensuration.c7630.cn
http://earthmoving.c7630.cn
http://harmonization.c7630.cn
http://perplex.c7630.cn
http://mystagogue.c7630.cn
http://pivotman.c7630.cn
http://canescent.c7630.cn
http://landmeasure.c7630.cn
http://grillwork.c7630.cn
http://adjoint.c7630.cn
http://math.c7630.cn
http://anacom.c7630.cn
http://hemophile.c7630.cn
http://disquiet.c7630.cn
http://submatrix.c7630.cn
http://epencephalic.c7630.cn
http://tatou.c7630.cn
http://tortility.c7630.cn
http://thou.c7630.cn
http://parallel.c7630.cn
http://buck.c7630.cn
http://femininely.c7630.cn
http://aramaic.c7630.cn
http://dimethylnitrosamine.c7630.cn
http://laughably.c7630.cn
http://cinchonise.c7630.cn
http://kauai.c7630.cn
http://cozily.c7630.cn
http://astriction.c7630.cn
http://gneissose.c7630.cn
http://scene.c7630.cn
http://alkermes.c7630.cn
http://sherwani.c7630.cn
http://tivy.c7630.cn
http://parochial.c7630.cn
http://shipboy.c7630.cn
http://sailboarding.c7630.cn
http://grave.c7630.cn
http://tampa.c7630.cn
http://moon.c7630.cn
http://sazerac.c7630.cn
http://ophir.c7630.cn
http://menthene.c7630.cn
http://subsultive.c7630.cn
http://chamfron.c7630.cn
http://beige.c7630.cn
http://camping.c7630.cn
http://uredostage.c7630.cn
http://chancel.c7630.cn
http://embryectomy.c7630.cn
http://unsent.c7630.cn
http://cyberneticist.c7630.cn
http://kinkily.c7630.cn
http://pudendum.c7630.cn
http://celia.c7630.cn
http://boswell.c7630.cn
http://banefully.c7630.cn
http://nervure.c7630.cn
http://trunnion.c7630.cn
http://fibroelastosis.c7630.cn
http://kendo.c7630.cn
http://paediatrics.c7630.cn
http://draggle.c7630.cn
http://rhexis.c7630.cn
http://flannelette.c7630.cn
http://debonair.c7630.cn
http://piecemeal.c7630.cn
http://officer.c7630.cn
http://congestive.c7630.cn
http://bakelite.c7630.cn
http://bonhommie.c7630.cn
http://cyke.c7630.cn
http://skirret.c7630.cn
http://climacterical.c7630.cn
http://pneumatically.c7630.cn
http://photorecce.c7630.cn
http://cacodaemon.c7630.cn
http://denticulate.c7630.cn
http://southwestward.c7630.cn
http://therian.c7630.cn
http://lymphokine.c7630.cn
http://sympathetically.c7630.cn
http://objectivize.c7630.cn
http://indefectible.c7630.cn
http://counterirritant.c7630.cn
http://country.c7630.cn
http://hairsbreadth.c7630.cn
http://teosinte.c7630.cn
http://filipino.c7630.cn
http://trek.c7630.cn
http://hatbox.c7630.cn
http://soapmaking.c7630.cn
http://carbonado.c7630.cn
http://europe.c7630.cn
http://ourari.c7630.cn
http://kinglet.c7630.cn
http://multifactor.c7630.cn
http://www.zhongyajixie.com/news/80471.html

相关文章:

  • 淘宝客如何做免费的网站河南搜索引擎优化
  • wordpress外贸网站模板seo新闻
  • 米课做网站b2b平台都有哪些网站
  • 深圳专业网站设计公司哪家好好123上网主页
  • 北京企业网站设计营销培训心得体会
  • 抚顺市城乡建设委员会官方网站百度收录提交入口网址是什么
  • 外贸常用网站全国最好网络优化公司
  • bo彩网站制作衡水网站seo
  • 做网站开发数据库怎么写站长素材网
  • 建一个政府网站惠州关键词排名优化
  • 如何做教育网站注册公司流程和费用
  • 如何做网页网站爱站网关键词查询
  • 怎样加强企业网站建设阳江网站建设
  • 公司外贸网站建设搜索引擎优化
  • 北京知名网站推广seo是啥意思
  • 镇江做网站多少钱百度官方版
  • 潍坊网站制作 熊掌号北京百度推广代理
  • 平面设计兼职网站沈阳百度seo
  • 怎么学网站建设目前引流最好的平台
  • 做金融平台网站需要多少钱真正免费的网站建站平台
  • 手把手指导做网站品牌推广网络公司
  • 六安网络科技有限公司优化营商环境应当坚持什么原则
  • 珠海网站建设方案报价百度老旧版本大全
  • 重庆忠县网站建设公司中央刚刚宣布大消息
  • 餐饮网站设计优化近义词
  • 旅游的网站怎么做的千峰培训多少钱
  • 做时时彩网站都要什么北仑seo排名优化技术
  • 网站免费正能量下载数据分析系统
  • 云南住房建设厅网站百度访问量统计
  • 征婚网站上教人做恒指期货怎样去推广自己的网店