04 SB实战 -微头条之头条模块(登录验证拦截器+发布文章+修改文章)

本文主要是介绍04 SB实战 -微头条之头条模块(登录验证拦截器+发布文章+修改文章),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.登陆验证

为什么还要做登陆验证?
尽管先前我们已经进行过登录, 但是要知道token是有有效期的, 而用户登陆后有可能长时间停留在页面不退出, 甚至这个停留的时间超出token有效期, 因此,尽管用户已经登录, 但是, 在需要登录才能进行的操作(进入发布页前、发布新闻前、进入修改页前)前, 仍需再对token进行登陆验证, 确保token仍在有效期.

  1. 接口描述

    url地址:user/checkLogin

    请求方式:get

    请求参数: 无

    请求头: token: 用户token

    响应数据:

    未过期:

{"code":"200","message":"success","data":{}
}
  过期:
{"code":"504","message":"loginExpired","data":{}
}
  1. 代码实现
    1. controller 验证token有效性
@Autowired
private JwtHelper jwtHelper;@GetMapping("checkLogin")
public Result checkLogin(@RequestHeader String token){//校验token是否有效,可以直接调用jwtHelper的方法if (StringUtils.isEmpty(token) || jwtHelper.isExpiration(token)){//没有传或者过期 未登录return Result.build(null, ResultCodeEnum.NOTLOGIN);}return Result.ok(null);
}

编写完controller即可简单测试,先用post传json登录获取token, 再用该handler测试用token能不能登录
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2. 创建拦截器

在这里插入图片描述

需要进行登录验证的功能有很多, 而头条下的功能涉及对数据库的修改, 因此都需要登录验证, 而头条的相关功能都位于/headline下, 因此不妨对/headline整体做个拦截器, 只要经过/headline的请求都要过一次拦截器校验登录状态是否有效.

  1. 需求描述

    • 客户端在进入发布页前、发布新闻前、进入修改页前、修改前、删除新闻前先向服务端发送请求携带token请求头
    • 后端接收token请求头后,校验用户登录是否过期并做响应
    • 前端根据响应信息提示用户进入登录页还是进入正常业务页面
      在这里插入图片描述
  2. 新建一个interceptor文件夹, 新建一个LoginProtectInterceptor拦截器 【所有/headline开头都需要检查登陆】

@Component
package com.sunsplanter.interceptor;import com.alibaba.druid.util.StringUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sunsplanter.utils.JwtHelper;
import com.sunsplanter.utils.Result;
import com.sunsplanter.utils.ResultCodeEnum;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerAdapter;
import org.springframework.web.servlet.HandlerInterceptor;/*** 检查请求头是否包含token*/
@Component
public class LoginProtectInterceptor implements HandlerInterceptor {@Autowiredprivate JwtHelper jwtHelper;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String token = request.getHeader("token");if (StringUtils.isEmpty(token) || jwtHelper.isExpiration(token)){Result result = Result.build(null, ResultCodeEnum.NOTLOGIN);ObjectMapper objectMapper = new ObjectMapper();String json = objectMapper.writeValueAsString(result);response.getWriter().print(json);//拦截return false;}else{//放行return true;}}
}
  3. 新建一个config文件夹, 新建一个WebMVCConfig拦截器配置类
 package com.sunsplanter.config;import com.sunsplanter.interceptor.LoginProtectInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
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 WebMVCConfig implements WebMvcConfigurer {@Autowiredprivate LoginProtectInterceptor loginProtectInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginProtectInterceptor).addPathPatterns("/headline/**");}
}

至此, 完成了拦截器的配置, 今后所有经过经过headline的请求都会先过拦截器,如果token有效则无感通过, 前往handler, 否则报错.

3. 发布文章

  1. 需求描述

    • 用户在客户端输入发布的新闻信息完毕后
    • 发布前先请求后端的登录校验接口验证登录
    • 登录通过则提交新闻信息
    • 后端将新闻信息存入数据库

在这里插入图片描述

  1. 接口描述

    url地址:headline/publish

    请求方式:post

    请求头: 用户token

    请求参数:

{"title":"尚硅谷宣布 ... ...",   // 文章标题"article":"... ...",          // 文章内容"type":"1"                    // 文章类别
}
响应数据:未登录
{"code":"504","message":"loginExpired","data":{}
}
成功
{"code":"200","message":"success","data":{}
}
  1. 代码实现
    1. controller
/*** 实现步骤:*   1. token获取userId [无需校验,拦截器会校验]*   2. 封装headline数据*   3. 插入数据即可*/
@PostMapping("publish")
public Result publish(@RequestBody Headline headline,@RequestHeader String token){//进既然进到了/headline/publish,说明拦截器已经校验token有效性,我们无需再管/**已知的信息只有token,title,article,type(文章类别),* 要完成插入headline表,必须补全headline表所需的其他信息:发布者ID,日期,阅读量* 正常来说这个是业务层的工作,congtroller只负责获取和返回参数,* 但要获取发布者ID的唯一办法是根据传入的token获取, 而接收传入参数又是controller的工作* 故在controller通过jwthelper逆向获取该登录用户的ID* */int userId = jwtHelper.getUserId(token).intValue();headline.setPublisher(userId);Result result = headlineService.publish(headline);return result;
}
  1. service

@Override
public Result publish(Headline headline) {headline.setCreateTime(new Date());headline.setUpdateTime(new Date());headline.setPageViews(0);headlineMapper.insert(headline);return Result.ok(null);
}
  1. 即可测试. 测试两种情形
    a. 未登录状态下,直接走headline/publish
    在这里插入图片描述
    在这里插入图片描述

b. 先登录获取token, 再携带token走headline/publish
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
进headline表中即可找到新增的表项.

4. 修改文章

  1. 需求描述

    • 前端先调用登录校验接口,校验登录是否过期
    • 登录校验通过后 ,则根据新闻id查询新闻的完整信息并响应给前端
  2. 接口描述

    url地址:headline/findHeadlineByHid

    请求方式:post

    请求参数:Param传参hid

    响应数据:

    成功

{"code":"200","message":"success","data":{"headline":{"hid":"1","title":"修改测试","article":"... ... ","type":"2"}}
}
  1. 代码实现
    1. headlineController
 /***     url地址:headline/findHeadlineByHid*     请求方式:post*     请求参数:Param传参hid*/@PostMapping("update")public Result update(@RequestBody Headline headline) {Result result = headlineService.updateHeadLine(headline);return result;}
  1. headlineService:
    Result updateHeadLine(Headline headline);
  1. headlineServiceImpl:
  @Overridepublic Result updateHeadLine(Headline headline) {/*** 涉及对数据库的修改,加乐观锁* 1.查询version版本* 2.请求的参数为"hid","title","article","type",未请求的参数中作者ID与创建时间无需改变,仅更改UpdateTime和Version字段即可* 3.将更改的参数set入headline对象中,并用headline对象调用update方法* MP检测到修改,自动比对新旧Version*/Integer version = headlineMapper.selectById(headline.getHid()).getVersion();headline.setVersion(version);headline.setUpdateTime(new Date());headlineMapper.updateById(headline);return Result.ok(null);}

这篇关于04 SB实战 -微头条之头条模块(登录验证拦截器+发布文章+修改文章)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/644272

相关文章

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Python中的getopt模块用法小结

《Python中的getopt模块用法小结》getopt.getopt()函数是Python中用于解析命令行参数的标准库函数,该函数可以从命令行中提取选项和参数,并对它们进行处理,本文详细介绍了Pyt... 目录getopt模块介绍getopt.getopt函数的介绍getopt模块的常用用法getopt模

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、