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

app安装官方免费下载站长seo工具

app安装官方免费下载,站长seo工具,网站建设资金投入分析,企业seo案例目录 一、登录优化-redis 1、SpringBoot集成redis 1.1 pom 1.2 yml 1.3 测试程序#xff08;非必须#xff09; 1.4 启动redis#xff0c;执行测试程序 2、令牌主动失效#xff08;代码优化#xff09; 2.1 UserController设置token到redis 2.2 登录拦截器Log…目录 一、登录优化-redis 1、SpringBoot集成redis 1.1 pom 1.2 yml  1.3 测试程序非必须 1.4 启动redis执行测试程序  2、令牌主动失效代码优化 2.1  UserController设置token到redis 2.2 登录拦截器LoginCheckInterceptor 2.3 UserController更新密码删除redis的tokenjwt 2.4 验证 2.4.1 调用登录接口 2.4.2 调用更新密码接口 ​编辑 二、SpringBoot项目部署 1、pom检查是否有打包插件 2、打包 3、运行jar 4、测试 三、属性配置方式  1、命令参数方式 2、环境变量方式 3、外部配置文件方式 4、配置优先级 四、多环境开发-Profiles  1、多环境开发-介绍 2、 多环境开发-Profiles同一个yaml 3、多环境开发-Profiles(不同yml) 4、多环境开发-Profiles分组 前言针对【SpringBoot3Vue3】二篇进行一些后端优化和一些实用的后端技术 一、登录优化-redis 1、SpringBoot集成redis 1.1 pom dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency 1.2 yml  spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/springbdfdfoot_vue?serverTimezoneUTCusername: rootpassword: ddfdfdfdmain:banner-mode: off # 关闭控制台springboot的logodata:redis:host: localhostport: 63791.3 测试程序非必须 package com.bocai;import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ValueOperations;import java.util.concurrent.TimeUnit;SpringBootTest //如果在测试类上添加这个注解那么将来单元测试方法执行之前会先初始化Spring容器 public class RedisTest {Autowiredprivate StringRedisTemplate stringRedisTemplate;Testpublic void testSet(){// 往redis中存储一个键值对 StringRedisTemplateValueOperationsString, String operations stringRedisTemplate.opsForValue();operations.set(username,仓颉书);operations.set(woman,舒淇,15, TimeUnit.SECONDS); //设置有效时间}Testpublic void testGet(){//从redis获取一个键值对ValueOperationsString, String operations stringRedisTemplate.opsForValue();System.out.println(operations.get(username));} }1.4 启动redis执行测试程序  2、令牌主动失效代码优化 2.1  UserController设置token到redis 登录完成生成token时同时将token存储到redis按键值对方式注意设置了时效要与token生成时的时效一致性。 package com.bocai.controller;import com.bocai.common.Result; import com.bocai.pojo.User; import com.bocai.service.UserService; import com.bocai.utils.JwtUtils; import com.bocai.utils.Md5Util; import com.bocai.utils.ThreadLocalUtil; import jakarta.validation.constraints.Pattern; import lombok.extern.slf4j.Slf4j; import org.hibernate.validator.constraints.URL; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.util.StringUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*;import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit;RestController Slf4j Validated RequestMapping(/user) public class UserController {Autowiredprivate UserService userService;Autowiredprivate StringRedisTemplate stringRedisTemplate;/*** 用户注册* param username* param password* return*/PostMapping(/register)public Result register(Pattern(regexp ^\\S{5,16}$) String username, Pattern(regexp ^\\S{5,16}$)String password){log.info(注册用户名{}密码为{},username,password);// 查询用户User user userService.queryUserByUsername(username);if (user null){//没有占用可以注册//注册用户userService.register(username,password);return Result.success();}else{return Result.error(用户名被占用);}}PostMapping(/login)public Result login(Pattern(regexp ^\\S{5,16}$) String username, Pattern(regexp ^\\S{5,16}$)String password) {log.info(登录用户名{}密码为{}, username, password);// 查询用户User loginUser userService.queryUserByUsername(username);// 判断用户是否存在if (loginUser null) {return Result.error(用户名不存在);}// 判断密码是否正确loginUser对象中的password是密文if(Md5Util.getMD5String(password).equals(loginUser.getPassword())){// 登录成功MapString, Object claims new HashMap();claims.put(id, loginUser.getId());claims.put(username,loginUser.getUsername());String jwt JwtUtils.generateJwt(claims); //让jwt包含了当前登录的员工信息// 把token存储到redisValueOperationsString, String operations stringRedisTemplate.opsForValue();operations.set(jwt,jwt,12, TimeUnit.HOURS); //过期时间与jwt设置的时效要一致性return Result.success(jwt);}return Result.error(密码错误);}/*** 查询用户信息从线程获取* return*/GetMapping(/userInfo)public Result userInfo(){// 从线程获取存储的jwt信息MapString, Object map ThreadLocalUtil.get();String username (String) map.get(username);log.info(查询用户全部信息,从token获取信息为{},username);//根据用户名查询用户User user userService.queryUserByUsername(username);return Result.success(user);}//使用上面的的优化版本 // /** // * 查询用户信息从token获取 // * param token // * return // */ // GetMapping(/userInfo) // public Result userInfo(RequestHeader(name Authorization)String token){ // log.info(查询用户全部信息,从token获取信息为{},token); // //根据用户名查询用户 // MapString, Object claims JwtUtils.parseJWT(token); // String username (String) claims.get(username); // User user userService.queryUserByUsername(username); // return Result.success(user); // }/*** 更新用户* param user* return*/PutMapping(/update)public Result update(RequestBody Validated User user){log.info(修改的用户为{},user);userService.updateUser(user);return Result.success();}/*** 更新头像* param avatarUrl* return*/PatchMapping(/updateAvatar)public Result updateAvatar(RequestParam URL String avatarUrl){log.info(头像地址是{},avatarUrl);userService.updateAvatar(avatarUrl);return Result.success();}/*** 更新密码* param params json数据包含old_pwd,new_pwd,re_pwd* return*/PatchMapping(/updatePwd)public Result updatePwd(RequestBody MapString, String params){log.info(修改密码传过来数据是:{},params);// 1、校验参数String old_pwd params.get(old_pwd);String new_pwd params.get(new_pwd);String re_pwd params.get(re_pwd);if(!StringUtils.hasLength(old_pwd) || !StringUtils.hasLength(new_pwd) || !StringUtils.hasLength(re_pwd)){return Result.error(缺少必要参数);}//原密码是否正确MapString, Object map ThreadLocalUtil.get();String username (String) map.get(username);User loginUser userService.queryUserByUsername(username);if(!loginUser.getPassword().equals(Md5Util.getMD5String(old_pwd))){return Result.error(原密码不正确);}//新、老密码是否一致if(old_pwd.equals(new_pwd)){return Result.error(新、老密码一样);}//新密码和确认密码不一致if(!re_pwd.equals(new_pwd)){return Result.error(新密码和确认密码不一致);}// 2 、调用userServiceuserService.updatePwd(new_pwd);return Result.success();} }2.2 登录拦截器LoginCheckInterceptor 登录拦截器当中查询redis当中是否存在相同tokenjwt,如果不存在所有失效了。抛出异常 package com.bocai.interceptor;import com.alibaba.fastjson.JSONObject; import com.bocai.common.Result; import com.bocai.utils.JwtUtils; import com.bocai.utils.ThreadLocalUtil; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;import java.util.Map;/*** LoginCheckInterceptor 拦截器 interceptor*/ Slf4j Component public class LoginCheckInterceptor implements HandlerInterceptor {Autowiredprivate StringRedisTemplate stringRedisTemplate;Override //目标资源方法运行前运行, 返回true: 放行, 放回false, 不放行public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {//1.获取请求url。String url req.getRequestURL().toString();log.info(请求的url: {},url);//2.判断请求url中是否包含login如果包含说明是登录操作放行。if(url.contains(login)){log.info(登录操作, 放行...);return true;}//3.获取请求头中的令牌 Authorization。String jwt req.getHeader(Authorization);//4.判断令牌是否存在如果不存在返回错误结果未登录。if(!StringUtils.hasLength(jwt)){log.info(请求头Authorization为空,返回未登录的信息);Result error Result.error(NOT_LOGIN);//手动转换 对象--json -------- 阿里巴巴fastJSONString notLogin JSONObject.toJSONString(error);resp.getWriter().write(notLogin);return false;}//5.解析token如果解析失败返回错误结果未登录。try {// 从redis中获取获取相同的tokenjwtValueOperationsString, String operations stringRedisTemplate.opsForValue();String redisJwt operations.get(jwt);if(redisJwt null){// token 已经失效throw new RuntimeException();}//解析jwtMapString, Object claims JwtUtils.parseJWT(jwt);//6.把业务数据存储到ThreadLocal中ThreadLocalUtil.set(claims);//7.放行。log.info(令牌合法, 放行);return true;} catch (Exception e) {//jwt解析失败e.printStackTrace();log.info(解析令牌失败, 返回未登录错误信息);Result error Result.error(NOT_LOGIN);//手动转换 对象--json -------- 阿里巴巴fastJSONString notLogin JSONObject.toJSONString(error);resp.getWriter().write(notLogin);return false;}}Override //目标资源方法运行后运行public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(postHandle ...);}Override //视图渲染完毕后运行, 最后运行public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 清空ThreadLocal中的数据,防止内存泄漏ThreadLocalUtil.remove();System.out.println(afterCompletion...);} }2.3 UserController更新密码删除redis的tokenjwt 更新密码的时候同时需要将redis存储的jwt删除掉。这里在更新密码方法上面使用从请求头当中获取Authorization package com.bocai.controller;import com.bocai.common.Result; import com.bocai.pojo.User; import com.bocai.service.UserService; import com.bocai.utils.JwtUtils; import com.bocai.utils.Md5Util; import com.bocai.utils.ThreadLocalUtil; import jakarta.validation.constraints.Pattern; import lombok.extern.slf4j.Slf4j; import org.hibernate.validator.constraints.URL; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.util.StringUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*;import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit;RestController Slf4j Validated RequestMapping(/user) public class UserController {Autowiredprivate UserService userService;Autowiredprivate StringRedisTemplate stringRedisTemplate;/*** 用户注册* param username* param password* return*/PostMapping(/register)public Result register(Pattern(regexp ^\\S{5,16}$) String username, Pattern(regexp ^\\S{5,16}$)String password){log.info(注册用户名{}密码为{},username,password);// 查询用户User user userService.queryUserByUsername(username);if (user null){//没有占用可以注册//注册用户userService.register(username,password);return Result.success();}else{return Result.error(用户名被占用);}}PostMapping(/login)public Result login(Pattern(regexp ^\\S{5,16}$) String username, Pattern(regexp ^\\S{5,16}$)String password) {log.info(登录用户名{}密码为{}, username, password);// 查询用户User loginUser userService.queryUserByUsername(username);// 判断用户是否存在if (loginUser null) {return Result.error(用户名不存在);}// 判断密码是否正确loginUser对象中的password是密文if(Md5Util.getMD5String(password).equals(loginUser.getPassword())){// 登录成功MapString, Object claims new HashMap();claims.put(id, loginUser.getId());claims.put(username,loginUser.getUsername());String jwt JwtUtils.generateJwt(claims); //让jwt包含了当前登录的员工信息// 把token存储到redisValueOperationsString, String operations stringRedisTemplate.opsForValue();operations.set(jwt,jwt,12, TimeUnit.HOURS); //过期时间与jwt设置的时效要一致性return Result.success(jwt);}return Result.error(密码错误);}/*** 查询用户信息从线程获取* return*/GetMapping(/userInfo)public Result userInfo(){// 从线程获取存储的jwt信息MapString, Object map ThreadLocalUtil.get();String username (String) map.get(username);log.info(查询用户全部信息,从token获取信息为{},username);//根据用户名查询用户User user userService.queryUserByUsername(username);return Result.success(user);}//使用上面的的优化版本 // /** // * 查询用户信息从token获取 // * param token // * return // */ // GetMapping(/userInfo) // public Result userInfo(RequestHeader(name Authorization)String token){ // log.info(查询用户全部信息,从token获取信息为{},token); // //根据用户名查询用户 // MapString, Object claims JwtUtils.parseJWT(token); // String username (String) claims.get(username); // User user userService.queryUserByUsername(username); // return Result.success(user); // }/*** 更新用户* param user* return*/PutMapping(/update)public Result update(RequestBody Validated User user){log.info(修改的用户为{},user);userService.updateUser(user);return Result.success();}/*** 更新头像* param avatarUrl* return*/PatchMapping(/updateAvatar)public Result updateAvatar(RequestParam URL String avatarUrl){log.info(头像地址是{},avatarUrl);userService.updateAvatar(avatarUrl);return Result.success();}/*** 更新密码* param params json数据包含old_pwd,new_pwd,re_pwd* param jwt 从请求头中获取Authorization赋值给jwt参数* return*/PatchMapping(/updatePwd)public Result updatePwd(RequestBody MapString, String params,RequestHeader(Authorization) String jwt){log.info(修改密码传过来数据是:{},params);// 1、校验参数String old_pwd params.get(old_pwd);String new_pwd params.get(new_pwd);String re_pwd params.get(re_pwd);if(!StringUtils.hasLength(old_pwd) || !StringUtils.hasLength(new_pwd) || !StringUtils.hasLength(re_pwd)){return Result.error(缺少必要参数);}//原密码是否正确MapString, Object map ThreadLocalUtil.get();String username (String) map.get(username);User loginUser userService.queryUserByUsername(username);if(!loginUser.getPassword().equals(Md5Util.getMD5String(old_pwd))){return Result.error(原密码不正确);}//新、老密码是否一致if(old_pwd.equals(new_pwd)){return Result.error(新、老密码一样);}//新密码和确认密码不一致if(!re_pwd.equals(new_pwd)){return Result.error(新密码和确认密码不一致);}// 2 、调用userServiceuserService.updatePwd(new_pwd);// 更新密码之后删除redis中对应的tokenjwtValueOperationsString, String operations stringRedisTemplate.opsForValue();operations.getOperations().delete(jwt);return Result.success();} }2.4 验证 2.4.1 调用登录接口 2.4.2 调用更新密码接口  二、SpringBoot项目部署 1、pom检查是否有打包插件 plugin                 groupIdorg.springframework.boot/groupId                 artifactIdspring-boot-maven-plugin/artifactId                  /plugin buildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationimagebuilderpaketobuildpacks/builder-jammy-base:latest/builder/imageexcludesexcludegroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/exclude/excludes/configuration/plugin/plugins/build 2、打包 插曲 1、无效的标记: --release  这里要与你得jdk版本一致性 2、注意test当中的case 3、运行jar java -jar SS.jar 4、测试 三、属性配置方式  1、命令参数方式 2、环境变量方式 3、外部配置文件方式 4、配置优先级 四、多环境开发-Profiles  1、多环境开发-介绍 2、 多环境开发-Profiles同一个yaml 3、多环境开发-Profiles(不同yml) 4、多环境开发-Profiles分组 分组实现
http://www.hkea.cn/news/14445397/

相关文章:

  • 门户网站服务范围建设部网站公示
  • 专门做单页的网站wordpress添加 logo
  • 电子商务网站营销的方法免费企业网站
  • 建设一个网站要学什么百度在线问答
  • 企业做网站应注意什么深圳代理记账公司收费标准
  • 湖南好搜网站建设北京建设工程主管部门网站
  • 联合年检在什么网站做国内代理ip地址
  • 上海找人做网站wordpress实现彩色标签云
  • 网站有死链怎么办wordpress作品集主题
  • 如何做企业网站优化网站seo优化免
  • 广东网站建设公司报价表佛山厂家推广优化
  • 怎么把危险网站苏宁网站建设
  • 江苏城乡和住房建设厅网站网络推广营销课程
  • 连云港网站建设的公司网站建设制作服务
  • 织梦发布网站谈谈如何建设企业人力资源网站
  • 社保服务个人网站华北建设招标网官方网站
  • 水果网站模板可信网站是否必须做
  • 拒绝做网站的理由杭州知名设计公司排名
  • 网站建设到上线做网站的如何找客户
  • 青岛建网站公司360推广 网站建设
  • 比较好的网页模板网站亚马逊网站入口
  • 莆田市城厢区建设局网站电商网站开发分析
  • 哪些网站做代理商做电影网站怎么盈利
  • 荣成做网站杭州网络公司排名
  • 苏州网站制作及推广免费户型图设计软件
  • 本地网站搭建工具建设工程平台网站
  • 快递网站策划怎么做ppt中国建设招标信息网站
  • 电影订票网站怎么做环境建设公司网站
  • 眉山网站建设公司什么是c2c平台
  • 电子商务网站有哪些?黄页88网是什么性质的网站