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

网站开发项目可行性分析手工做火枪的网站

网站开发项目可行性分析,手工做火枪的网站,外国人做中国英语视频网站,网站管理员密码忘记了前言 大家从b站大学学习的项目侧重点好像都在基础功能的实现上#xff0c;反而一个项目最根本的登录拦截请求接口都不会写#xff0c;怎么拦截#xff1f;为什么拦截#xff1f;只知道用户登录时我后端会返回一个token#xff0c;这个token是怎么生成的#xff0c;我把它…前言 大家从b站大学学习的项目侧重点好像都在基础功能的实现上反而一个项目最根本的登录拦截请求接口都不会写怎么拦截为什么拦截只知道用户登录时我后端会返回一个token这个token是怎么生成的我把它返回给前端干什么用前端怎么去处理这个token这个是我在学习过程中一知半解的等开始做自己的项目时才知道原来还有这么多不会本文就来讲解一下怎么去实现登录拦截请求校验的方法。 一、导入数据库表依赖 这里有一张常用的用户表作为本文的实战测试 CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,username varchar(50) NOT NULL COMMENT 用户名,password varchar(255) NOT NULL COMMENT 密码,email varchar(100) DEFAULT NULL COMMENT 邮箱,create_time datetime DEFAULT NULL COMMENT 创建时间,login_time datetime DEFAULT NULL COMMENT 最后一次登录时间,avatar varchar(255) DEFAULT NULL COMMENT 头像,PRIMARY KEY (id),UNIQUE KEY username (username) USING BTREE,UNIQUE KEY email (email) USING BTREE ) ENGINEInnoDB AUTO_INCREMENT33 DEFAULT CHARSETutf8mb4 COMMENT用户表;运行然后连接。 二、登陆接口实现 Api(tags 用户相关接口) RestController RequestMapping(/user) public class UserController {Autowiredprivate UserService userService;Autowiredprivate JwtProperties jwtProperties;ApiOperation(用户登录)PostMapping(/login)public Result login(RequestBody User user) {user userService.login(user);//登录成功后生成jwt令牌MapString, Object claims new HashMap();claims.put(userId, user.getId());String token JwtUtil.createJWT(jwtProperties.getUserSecretKey(),jwtProperties.getUserTtl(),claims);UserLoginVo userLoginVo UserLoginVo.builder().user(user).token(token).build();return Result.okResult(userLoginVo);}ApiOperation(注册用户)PostMappingpublic Result addUser(RequestBody UserDto userDto) {userService.addUser(userDto);return Result.okResult();}ApiOperation(更新用户信息)PostMapping(/update)public Result uploadAvatar(User user) {userService.uploadAvatar(user);return Result.okResult();}GetMapping(/test)public Result test() {return Result.okResult(test);} } 写了几个常用的用户层接口用来测试主要关注用户登录/login接口其他的暂时无需理会。 配置JwtProperties 类 Component ConfigurationProperties(prefix zwk.jwt) Data public class JwtProperties {/*** 用户生成jwt令牌相关配置*/private String userSecretKey;private long userTtl;private String userTokenName;}JwtProperties 对应的配置文件 zwk:jwt:# 设置jwt签名加密时使用的秘钥user-secret-key: zwkzwk# 设置jwt过期时间user-ttl: 7200000# 设置前端传递过来的令牌名称user-token-name: token配置UserService 类 public interface UserService {void addUser(UserDto userDto);User login(User user);void uploadAvatar(User user); }UserService 的实现类 Service public class UserServiceImpl implements UserService {Autowiredprivate UserMapper userMapper;/*** 新增用户* param userDto*/public void addUser(UserDto userDto) {User user new User();BeanUtils.copyProperties(userDto, user);//user.setEmail(123qq.com);user.setCreateTime(new Date());user.setLoginTime(new Date());userMapper.insert(user);}public User login(User user) {String password user.getPassword();final User user1 userMapper.getUserByName(user.getUsername());if (user1 null) {throw new RuntimeException(该用户名不存在);}//对密码进行md5加密//password DigestUtils.md5DigestAsHex(password.getBytes());if (!password.equals(user1.getPassword())){throw new RuntimeException(密码错误);}return user1;}/*** 更新用户信息* param user* return*/Overridepublic void uploadAvatar(User user) {userMapper.updateById(user);} }这里主要是对用户登录时传过来的用户名和密码进行校验校验通过后我们再重新回到控制层看看是怎么处理的。 ApiOperation(用户登录)PostMapping(/login)public Result login(RequestBody User user) {user userService.login(user);//登录成功后生成jwt令牌MapString, Object claims new HashMap();claims.put(userId, user.getId());String token JwtUtil.createJWT(jwtProperties.getUserSecretKey(),jwtProperties.getUserTtl(),claims);UserLoginVo userLoginVo UserLoginVo.builder().user(user).token(token).build();return Result.okResult(userLoginVo);}如果登录成功代码将生成一个 JWTJSON Web Token令牌。JWT 是一种紧凑的、自包含的方式用于在客户端和服务器之间传递安全信息。在这个例子中JWT 令牌包含了用户的 ID 信息。claims 是一个 Map用于存储 JWT 中的声明Claims这里存储了用户 ID。JwtUtil.createJWT 方法用于创建 JWT 令牌它接收三个参数用户的密钥jwtProperties.getUserSecretKey()、令牌的有效时间jwtProperties.getUserTtl()和声明信息claims。 导入User类 Data AllArgsConstructor NoArgsConstructor public class User implements Serializable {private static final long serialVersionUID 1L;/*** 主键*/TableIdprivate Long id;/*** 用户名*/private String username;private String password;private String email;JsonFormat(pattern yyyy-MM-dd HH:mm:ss, timezone GMT8)private Date createTime;JsonFormat(pattern yyyy-MM-dd HH:mm:ss, timezone GMT8)private Date LoginTime;/*** 头像*/private String avatar; }导入UserLoginVo类 Data NoArgsConstructor AllArgsConstructor Builder public class UserLoginVo {private String token;private User user; }编写JwtUtil工具类该类用来生成jwt令牌 public class JwtUtil {/*** 生成jwt* 使用Hs256算法, 私匙使用固定秘钥** param secretKey jwt秘钥* param ttlMillis jwt过期时间(毫秒)* param claims 设置的信息* return*/public static String createJWT(String secretKey, long ttlMillis, MapString, Object claims) {// 指定签名的时候使用的签名算法也就是header那部分SignatureAlgorithm signatureAlgorithm SignatureAlgorithm.HS256;// 生成JWT的时间long expMillis System.currentTimeMillis() ttlMillis;Date exp new Date(expMillis);// 设置jwt的bodyJwtBuilder builder Jwts.builder()// 如果有私有声明一定要先设置这个自己创建的私有的声明这个是给builder的claim赋值一旦写在标准的声明赋值之后就是覆盖了那些标准的声明的.setClaims(claims)// 设置签名使用的签名算法和签名使用的秘钥.signWith(signatureAlgorithm, secretKey.getBytes(StandardCharsets.UTF_8))// 设置过期时间.setExpiration(exp);return builder.compact();}/*** Token解密** param secretKey jwt秘钥 此秘钥一定要保留好在服务端, 不能暴露出去, 否则sign就可以被伪造, 如果对接多个客户端建议改造成多个* param token 加密后的token* return*/public static Claims parseJWT(String secretKey, String token) {// 得到DefaultJwtParserClaims claims Jwts.parser()// 设置签名的秘钥.setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8))// 设置需要解析的jwt.parseClaimsJws(token).getBody();return claims;}}以上就是我们前期准备工作然后发现好像还是没用因为我们还没有做自定义拦截处理。我们首先对除了/user/login接口进行放行其他接口全部拦截。 编写JwtTokenAdminInterceptor 类重写HandlerInterceptor方法 Component Slf4j public class JwtTokenAdminInterceptor implements HandlerInterceptor {Autowiredprivate JwtProperties jwtProperties;/*** 校验jwt** param request* param response* param handler* return* throws Exception*/public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//判断当前拦截到的是Controller的方法还是其他资源if (!(handler instanceof HandlerMethod)) {//当前拦截到的不是动态方法直接放行return true;}//1、从请求头中获取令牌String token request.getHeader(jwtProperties.getUserTokenName());//2、校验令牌try {log.info(jwt校验:{}, token);Claims claims JwtUtil.parseJWT(jwtProperties.getUserSecretKey(), token);Long userId Long.valueOf(claims.get(userId).toString());log.info(当前用户id{}, userId);//3、通过放行return true;} catch (Exception ex) {//4、不通过响应401状态码response.setStatus(401);return false;}} }自定义拦截器WebMvcConfiguration Configuration Slf4j public class WebMvcConfiguration extends WebMvcConfigurationSupport {Autowiredprivate JwtTokenAdminInterceptor jwtTokenAdminInterceptor;/*** 注册自定义拦截器* param registry*/protected void addInterceptors(InterceptorRegistry registry) {log.info(开始注册自定义拦截器...);registry.addInterceptor(jwtTokenAdminInterceptor).addPathPatterns(/user/**) //表示拦截所以前缀带/user的请求.excludePathPatterns(/user/login); //排除特定路径excludePathPatterns(/user/login) 方法用于排除某些路径//即使它们匹配前面指定的模式。在这个例子中/user/login 路径不会被 jwtTokenAdminInterceptor 拦截。}/*** 设置静态资源映射* param registry*/protected void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler(/doc.html).addResourceLocations(classpath:/META-INF/resources/);registry.addResourceHandler(/webjars/**).addResourceLocations(classpath:/META-INF/resources/webjars/);} }然后对接口进行登录测试 登录测试 {code: 200,msg: 操作成功,data: {token: eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3MjA2MDI3NzIsInVzZXJJZCI6MX0.Cf1ew-rPOkRYup5tird7nVD9xiHblNhYHwtdFHGQqV0,user: {id: 1,username: kkk,password: kkk123,email: 2765314967qq.com,createTime: 2024-07-10 10:44:36,LoginTime: 2024-07-10 10:44:42,avatar: null,loginTime: 2024-07-10 10:44:42}} }可以看见登录成功后我们成功向前端返回token令牌。 那么前端拿到了这个token令牌有什么用呢 第一次登录的时候前端调用后端的登录接口发送用户名和密码后端收到请求验证用户名和密码验证成功就给前端返回一个token前端拿到token将token存储到localStorage和vuex中并跳转路由页面前端每次跳转路由就判断localStorage中有无token没有就跳转到登录页面有则跳转到对应的路由页面每次调后端接口都要在请求头中加token后端判断请求头中有无token有token就拿到token并验证token验证成功就返回数据验证失败例如token过期就返回403请求头中没有token也返回403如果前端拿到状态码为403就清除token信息并跳转到登录页面 这个时候我们再来测试其他接口应为我们刚刚只放行了/user/login接口其他接口是一律拦截的我们看看直接请求会发生什么。 可以发现当我们请求这个测试接口时返回状态码401和我们预想的一样如图就是我们刚刚写的JwtTokenAdminInterceptor类 然后发现控制台的jwt为空这就应对了我们前面所说的当我们将token返回给前端之后前端之后的每次请求都会把token携带到到请求头header里面传给后端我们后端就可以通过HttpServletRequest获取请求头token如图 然后根据我们后端自定义的拦截器看看是否需要对这个请求头进行判断如果不需要判断直接放放行否则进行jwt校验。 那我们再次回到刚刚/user/test接口我们刚刚也是由前端对该接口进行请求但这个时候前端请求头里面的token为空我们后端又对这个接口进行了拦截所以校验自然失败无法访问这个时候我们再把登录时生成的token放在前端传给侯丹的请求头里看看会发生什么. 可以看到这个时候就能成功请求。再看看控制台 可以发现后端拿到前端传过来的token后校验通过并且还可以通过token获取用户id我们再回过头看看最开始的问题这个token有什么用这个通过token获取用户id就是最明显的体现之一。 我们只需要通过 Claims claims JwtUtil.parseJWT(jwtProperties.getUserSecretKey(), token);Long userId Long.valueOf(claims.get(userId).toString());我讲的也不是很清楚建议大家细看JwtTokenAdminInterceptor和 WebMvcConfiguration这两个类方可大成。 等我我后续大成后再重新回来更新。
http://www.zqtcl.cn/news/133659/

相关文章:

  • 郑州网络建站公司wordpress安装及配置
  • 福州移动网站建设公司注册地址怎么写
  • 网站线上投票怎样做做铁艺需要什么网站
  • 襄阳营销型网站建设网站开发语言排行榜
  • 网站架构演变流程淄博亿泰
  • 电子商务网站功能介绍招商网站建设
  • 哈尔滨模板网站建站市场监督管理局12315
  • 做网站图片处理问题淘宝客推广
  • 科目一速成网站建设适合网络科技的公司名字
  • 解决网站兼容性问题网站关于我们怎么做
  • 网站建设教学视频百度云盘wap什么意思网络语言
  • 做psd模板下载网站搜索网站哪个好
  • 企业排名重庆网站seo优化
  • 怎么做免费域名网站永兴网站建设
  • 网站seo新手台州公司网站外包
  • html简单网站成品免费网站编辑属于什么行业
  • 装修网站设计平台景区网站建设策划案
  • 哪些网站布局设计做的比较好的商洛市城乡建设规划局网站
  • dw中旅游网站怎么做简单大气网站源码
  • 物流网站建设模板黄页网站推广app免费下载
  • iis添加网站的物理路径有资源的公众号
  • 答建设网站建网站的设备
  • 网站新闻专题怎么做python 做网站 用哪个框架好
  • 聊城做网站做的不错的网页链接打不开
  • 网站建设遇到的问题wordpress首页布局修改
  • 网站上传 404小猫mip网站建设
  • 网站的运营长春seo外包
  • 成都 网站制作购物网站建设包括哪些
  • 浅谈电子商务网站建设产品推广方案怎么做
  • 做ppt的图片素材网站北京网站制作南昌