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

设计研发网站dede网站婚纱模板

设计研发网站,dede网站婚纱模板,宜宾建设网站,合肥制作小程序环境介绍 技术栈 springbootmybatis-plusmysqljava-jwt 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 Json Web令牌简称JWT Token是在服务端产生的一串字符串是客户端访问资源接口(AP)时所需要的资源凭证。…环境介绍 技术栈 springbootmybatis-plusmysqljava-jwt 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 Json Web令牌简称JWT Token是在服务端产生的一串字符串是客户端访问资源接口(AP)时所需要的资源凭证。 Token认证 Token是在服务端产生的一串字符串是客户端访问资源接口(AP)时所需要的资源凭证。 Token认证流程 1、客户端使用用户名跟密码请求登录,服务端收到请求,验证用户名与密码验证成功后,服务端会签发一个 token并把这个 token发送给客户端客户端收到 token后,会把它存储起来,比如放在cookie里或者localStorage里 2、客户端每次向服务端请求资源的时候需要带着服务端签发的 token 3、服务端收到请求,然后去验证客户端请求里面带着的 token,如果验证成功就向客户端返回请求的数据 token用户认证是一种服务端无状态的认证方式,服务端不用存放token数据。 用解析 token的计算时间换取 session的存储空间,从而减服务器的力,减少频繁的查询数据库 token完全由应用管理,所以它可以避开同源策略 JWT的使用 JSON Web Token(简称JWT)是一个 token的具体实现方式,是目前最流行的跨域认证解决方案。JWT的原理是服务器认证以后,生成一个JSON对象,发回给用户。 { “name” :”张三”, “time”:”2022年10月10日” } 用户与服务端通信时都要发回该JSON对象。服务器完全只靠这个对象认定用户身份。 为防止用户篡改数据服务器在生成对象时会加上签名 JWT由三个部分组成Header(头部)、Payload(负载)、Signature(签名) Header.Payload.Signature 官方描述 Header JWT头是一个描述JWT元数据的JSON对象alg属性表示签名使用的算法默认为HMAC SHA256写为HS256typ属性表示令牌的类型JWT令牌统一写为JWT。最后使用Base64 URL算法将上述JSON对象转换为字符串保存 { alg: HS256, typ: JWT } Payload 有效载荷部分是JWT的主体内容部分也是一个JSON对象包含需要传递的数据。 JWT指定七个默认字段供选择 iss发行人 exp到期时间 sub主题 aud用户 nbf在此之前不可用 iat发布时间 jtiJWT ID用于标识该JWT Signature 签名哈希部分是对上面两部分数据签名需要使用base64编码后的header和payload数据通过指定的算法生成哈希以确保数据不会被篡改。 加入依赖 dependencygroupIdcom.auth0/groupIdartifactIdjava-jwt/artifactIdversion4.3.0/version /dependency 数据库 实体类 package com.example.domain;import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.util.Date; import lombok.Data;/*** * TableName user*/ TableName(value user) Data public class User implements Serializable {/*** 用户id*/TableId(type IdType.AUTO)private Integer uid;/*** 用户名*/private String username;/*** 密码*/private String password;/*** 盐值*/private String salt;/*** 电话号码*/private String phone;/*** 电子邮箱*/private String email;/*** 性别:0-女1-男*/private Integer gender;/*** 头像*/private String avatar;/*** 是否删除0-未删除1-已删除*/private Integer isDelete;/*** 日志-创建人*/private String createdUser;/*** 日志-创建时间*/private Date createdTime;/*** 日志-最后修改执行人*/private String modifiedUser;/*** 日志-最后修改时间*/private Date modifiedTime;TableField(exist false)private static final long serialVersionUID 1L; } mapper(dao) package com.example.mapper;import com.example.domain.User; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param;import java.util.Date; Mapper public interface UserMapper extends BaseMapperUser {/*** 插入用户数据* param user 用户数据* return 受影响的行数*/int insert(User user);/*** 根据用户名查询用户是否存在* param username* return 成功返回单个用户数据否返回null*/User findByUserName(Param(username) String username);/*** 根据uid查询* param uid* return*/User findByUid(Param(uid) Integer uid);/*** 更新用户个人资料信息* param user* return*/Integer updateUserInfoByUid(User user);/*** 根据用户id修改密码* param uid* return password?,modified_user?,modified_time?*/Integer updatePasswordByUid(Param(uid)Integer uid,Param(password)String password,Param(modified_user)String modified_user,Param(modified_time) Date modified_time); }UserMapper.xml ?xml version1.0 encodingUTF-8? !DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.example.mapper.UserMapperresultMap idUserPojoMap typecom.example.domain.Userid columnuid propertyuid/idresult columnis_delete propertyisDelete/resultresult columncreated_user propertycreatedUser/resultresult columncreated_time propertycreatedTime/resultresult columnmodified_user propertymodifiedUser/resultresult columnmodified_time propertymodifiedTime/result/resultMap!-- useGeneratedKeystrue 开启主键自增 keyPropertyuid 指定uid字段--insert idinsert useGeneratedKeystrue keyPropertyuidinsert into user(username,password,salt,phone,email,gender,avatar,is_delete,created_user,created_time,modified_user,modified_time)values(#{username},#{password},#{salt},#{phone},#{email},#{gender},#{avatar},#{isDelete},#{createdUser},#{createdTime},#{modifiedUser},#{modifiedTime})/insertselect idfindByUserName resultMapUserPojoMapselect * from user where username#{username}/selectselect idfindByUid resultMapUserPojoMapselect * from user where uid#{uid}/selectupdate idupdatePasswordByUidupdate user set password#{password},modified_user#{modified_user},modified_time#{modified_time} where uid#{uid}/updateupdate idupdateUserInfoByUidupdate user setif testphone!nullphone#{phone},/ifif testemail!nullemail#{email},/ifif testgender!nullgender#{gender},/ifmodified_user#{modifiedUser}, modified_time#{modifiedTime} where uid#{uid}/updatesql idBase_Column_Listuid,username,password,salt,phone,email,gender,avatar,is_delete,created_user,created_time,modified_user,modified_time/sql /mapperservice package com.example.service;import com.example.domain.User; import com.baomidou.mybatisplus.extension.service.IService; public interface UserService extends IServiceUser {/*** 用户注册方法* param user*/void reg(User user);/*** 用户登入方法* param username* param password* return*/User login(String username,String password);/*** 根据uid查询* param uid* return User*//**** param uid* param username* param oldPassword* param newPassword*/void changePassword(Integer uid,String username,String oldPassword,String newPassword);/*** 通过uid获取用户数据* param uid* return*/User getUserInfoByUid(Integer uid);/*** 修改用户信息* param user* return*/void changeUserInfo(Integer uid,String username,User user);}ServiceImpl package com.example.service.impl;import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.domain.User; import com.example.service.UserService; import com.example.mapper.UserMapper; import com.example.service.exception.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.DigestUtils;import java.util.Date; import java.util.UUID; Service DS(wms) public class UserServiceImpl extends ServiceImplUserMapper, Userimplements UserService{Autowiredprivate UserMapper userDao;Overridepublic void reg(User user) {//判断用户是否被注册过String username user.getUsername();User byUserName userDao.findByUserName(username);if (byUserName null){//密码的加密处理:MD5算法//盐值password盐值String oldPassword user.getPassword();//获取盐值String salt UUID.randomUUID().toString().toUpperCase();//保存盐值user.setSalt(salt);String newPassword getMD5Password(oldPassword,salt);user.setPassword(newPassword);//用户注册// is_delete INT COMMENT 是否删除0-未删除1-已删除,// created_user VARCHAR(20) COMMENT 日志-创建人,// created_time DATETIME COMMENT 日志-创建时间,// modified_user VARCHAR(20) COMMENT 日志-最后修改执行人,// modified_time DATETIME COMMENT 日志-最后修改时间,Date nowTimenew Date();user.setIsDelete(0);user.setCreatedUser(user.getUsername());user.setCreatedTime(nowTime);user.setModifiedUser(user.getUsername());user.setModifiedTime(nowTime);Integer rows userDao.insert(user);if (rows 0 ){throw new InsertException(注册失败未知失败请重新注册);};}else {throw new UsernameOccupyException(用户名被占用);}}Overridepublic User login(String username,String password) {User UserLogin userDao.findByUserName(username);//盐值认证String md5Password getMD5Password(password, UserLogin.getSalt());if (UserLogin null){throw new UserNullException(用户不存在);}//检测密码是否匹配if (!UserLogin.getPassword().equals(md5Password)){throw new PasswordNotMatchException(用户密码错误);}//判断is_delete字段值是否为1表示被标记为删除if (UserLogin.getIsDelete() 1){throw new UserNullException(用户已被删除);}User user new User();user.setUid(UserLogin.getUid());user.setUsername(UserLogin.getUsername());user.setAvatar(UserLogin.getAvatar());//返回用户数据是为了辅助页面return user;}Overridepublic void changePassword(Integer uid, String username, String oldPassword, String newPassword) {User user userDao.findByUid(uid);if (user null){throw new UserNullException(用户不存在);}if (user.getIsDelete() 1){throw new UserDeletedException(用户不存在或已被删除);}//密码对比String md5Password getMD5Password(oldPassword, user.getSalt());if (!user.getPassword().equals(md5Password)){throw new PasswordNotMatchException(原密码错误);}//更新passwordString newPasswordMd5 getMD5Password(newPassword, user.getSalt());Integer rows userDao.updatePasswordByUid(uid, newPasswordMd5,username,new Date());if (rows !1){throw new PasswordUpdateException(修改密码未知异常);}}//根据id获取userInfoOverridepublic User getUserInfoByUid(Integer uid) {User result userDao.findByUid(uid);if (result null || result.getIsDelete() 1){throw new UserNullException(用户不存在);}User user new User();user.setUsername(result.getUsername());user.setUid(result.getUid());user.setPhone(result.getPhone());user.setEmail(result.getEmail());user.setGender(result.getGender());return user;}//修改用户信息Overridepublic void changeUserInfo(Integer uid, String username, User user) {User result userDao.findByUid(uid);if (result null || result.getIsDelete() 1){throw new UserNullException(用户不存在);}user.setUid(uid);user.setModifiedUser(username);user.setModifiedTime(new Date());Integer rows userDao.updateUserInfoByUid(user);if (rows ! 1){throw new InfoUpdateException(修改用户信息未知异常);}}//password加密方法private String getMD5Password(String password,String salt){for (int i 0;i5;i){password DigestUtils.md5DigestAsHex((salt password salt).getBytes()).toUpperCase();}//返回加密之后的密码return password;} }JWT工具类 public class JWTUtil {private static final String TOKENKeyqgs12345;/*** 生成token* param map* return 返回token*/public static String getToken(MapString,String map){Calendar instance Calendar.getInstance();instance.add(Calendar.DATE,7);//7天过期//添加payloadJWTCreator.Builder builder JWT.create();map.forEach((k,v)-{builder.withClaim(k,v);});builder.withExpiresAt(instance.getTime());//设置令牌过期时间//生成并返回tokenreturn builder.sign(Algorithm.HMAC256(TOKENKey)).toString();}/*** 验证token* param token*/public static void verify(String token){JWT.require(Algorithm.HMAC256(TOKENKey)).build().verify(token);}/*** 获取token中payload* param token* return*/public static DecodedJWT getTokenInfo(String token){return JWT.require(Algorithm.HMAC256(TOKENKey)).build().verify(token);} } UserController RestController RequestMapping(/users) CrossOrigin //表示都允许跨域访问 public class UserController extends BaseController{Autowiredprivate UserService userModuleService;RequestMapping(/login)public MapString,Object login(String username, String password){MapString,Object map new HashMap();try {User data userModuleService.login(username, password);MapString,String payload new HashMap();payload.put(username,data.getUsername());//生成JWT令牌String token JWTUtil.getToken(payload);map.put(state,true);map.put(msg,登入成功);map.put(token,token);}catch (Exception e){map.put(state,false);map.put(msg,登入失败);}return map;}} 登录产生token 验证token方式一 认证代码中写token认证流程过多的认证请求会导致代码冗余 RestController RequestMapping(/users) CrossOrigin //表示都允许跨域访问 public class UserController extends BaseController{Autowiredprivate UserService userModuleService;RequestMapping(/login)//验证tokenRequestMapping(/loginVerify)public MapString,Object loginVerify(String token){System.out.println(token);MapString,Object map new HashMap();try {//生成JWT令牌JWTUtil.verify(token);map.put(state,true);map.put(msg,验证成功);}catch (Exception e){map.put(state,true);map.put(msg,验证失败);}return map;}} 验证token方式二 JWT拦截器 抛弃方式一的代码冗余 public class JWTInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {MapString,Object map new HashMap();// 获取请求头中的JWT令牌String token request.getHeader(token);// 进行JWT令牌的验证逻辑try {//生成JWT令牌JWTUtil.verify(token);return true;//放行请求}catch (Exception e){map.put(state,false);map.put(msg,token验证失败);//map转jsonString msg new ObjectMapper().writeValueAsString(map);response.setContentType(application/json;charsetutf-8);response.getWriter().println(msg);}return false;} } Component public class InterceptorConfig implements WebMvcConfigurer {public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new JWTInterceptor()).addPathPatterns(/users//loginVerify)//拦截路径根据实际情况进行配置.excludePathPatterns(/users/login,/reg) ;//放行路径}} 简化loginVerify后 //验证token RequestMapping(/loginVerify) public MapString,Object loginVerify(HttpServletRequest request){MapString,Object map new HashMap();String token request.getHeader(token);System.out.println(token);map.put(state,true);map.put(msg,验证成功);return map; } 请求头携带token效果 Session认证 session用户认证流程 1、用户向服务器发送用户名和密码。 2、服务器验证通过后,在当前对话( session)里面保存相关数据,比如用户角色登录时间等。 3、服务器向用户返回一个 session_id,写入用户的 Cookie。 4、用户随后的每一次请求,都会通过Cookie,将 session_id传回服务器。 5、服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。
http://www.zqtcl.cn/news/119643/

相关文章:

  • 黑链 对网站的影响网页小游戏网站有哪些
  • wordpress 网站卡做百度移动网站排名
  • 金融企业网站整站源码网站需要写哪些内容
  • 重庆做网站的网络公司河北建设厅官方网站八大员考试
  • 网站域名缴费服装企业网站建设现状
  • 南阳建设网站哪家好做金融网站
  • 挖矿网站怎么做域名注册需要多少钱?
  • 哈尔滨制作网站企业各位给推荐个网站
  • 程序员做网站类的网站犯法吗wordpress源码系统下载
  • 西安注册公司在哪个网站国际知名工程咨询公司
  • 重庆市网站备案材料做网站和做新媒体运营
  • 大岭山网站建设公司网站建设需要具备的能力
  • 网站建设接外包流程网上可以报警备案吗
  • 建筑网站接单WordPress文章数据转emlog
  • 海口网络平台网站开发wordpress on lnmp
  • 手机怎么登录自己做的网站免费注册域名网站知乎
  • 万宁市住房和城乡建设局网站网页游戏制作过程的
  • 网站建设批复意见浏览有关小城镇建设的网站 记录
  • 做国际贸易做什么网站遵义做网站优化
  • 电商平台正在建设中网站页面提示开发手机网站用什么好
  • 电商设计素材网站推荐百度云app下载安装
  • 网站怎样和首页做链接地址百度怎么打广告在首页
  • 眉县做网站网站开发技术可行性分析
  • 深圳求职网站哪个好网站上面的在线咨询是怎么做的
  • 做饰品一般用什么网站做首饰凡客数据
  • 工业电商做网站怎么样wordpress 韩国 主题
  • 网站的优化从几个方面网站建设需注意哪些事项
  • 网站建设的技术有哪些内容东莞网站建设最优
  • 网站建设税费很多网站没有后台
  • 百度云主机上装网站flash怎么做网页