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

个人备案网站可以做电影站吗建立网站需要什么条件

个人备案网站可以做电影站吗,建立网站需要什么条件,长沙门户网站建设,拟定网站优化方案文章目录 回顾添加依赖Jwt依赖Jwt配置定义Jwt拦截器注册Jwt拦截器,配置需要验证token的URL 测试Jwt修改登录等逻辑 回顾 在之前的系统中,我们利用UUID配合Redis以达到角色登录的功能。 当前整个系统存在一个问题:人为修改token值后&#xf…

文章目录

  • 回顾
  • 添加依赖
    • Jwt依赖
    • Jwt配置
    • 定义Jwt拦截器
    • 注册Jwt拦截器,配置需要验证token的URL
  • 测试Jwt
  • 修改登录等逻辑

回顾

在之前的系统中,我们利用UUID配合Redis以达到角色登录的功能。

当前整个系统存在一个问题:人为修改token值后,用户仍然能在前端进行数据库操作,后台没有校验当前用户token就允许一些请求,导致系统存在安全漏洞

解决方法:Jwt签名验证。整合Jwt后,前端发出的请求后端会先进行token验证,然后执行操作。

整合Jwt的效果如下:找到token值,然后进行修改
在这里插入图片描述

token前加上值123,保存后进行一些操作
在这里插入图片描述

此时点击页面修改按钮,会弹出token错误的信息
在这里插入图片描述

后端也会记录token错误的信息
在这里插入图片描述
现在开始来实现这个功能

添加依赖

在这里插入图片描述

Jwt依赖

在pom文件中添加下述依赖

<!-- jwt -->
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>

Jwt配置

common文件夹下新建一个文件夹utils,然后新建java文件JwtUtil
在这里插入图片描述

写上下述代码,注释已标出

package com.ums.common.utils;import com.alibaba.fastjson2.JSON;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;
import java.util.UUID;@Component
public class JwtUtil {// 有效期private static final long JWT_EXPIRE = 30*60*1000L;  //半小时, 单位为毫秒// 令牌秘钥private static final String JWT_KEY = "123456";// Object data 可放入User对象,给User中的信息加密后成为tokenpublic  String createToken(Object data){// 当前时间long currentTime = System.currentTimeMillis();// token过期时间long expTime = currentTime+JWT_EXPIRE;// 构建jwtJwtBuilder builder = Jwts.builder().setId(UUID.randomUUID()+"").setSubject(JSON.toJSONString(data))    // User对象序列化.setIssuer("system").setIssuedAt(new Date(currentTime)).signWith(SignatureAlgorithm.HS256, encodeSecret(JWT_KEY))  // 加密.setExpiration(new Date(expTime));return builder.compact();}// 加密算法private SecretKey encodeSecret(String key){byte[] encode = Base64.getEncoder().encode(key.getBytes());SecretKeySpec aes = new SecretKeySpec(encode, 0, encode.length, "AES");return  aes;}// token 解密public Claims parseToken(String token){Claims body = Jwts.parser().setSigningKey(encodeSecret(JWT_KEY)).parseClaimsJws(token).getBody();return body;}// token 解密,并返回一个对象,可是User对象public <T> T parseToken(String token,Class<T> clazz){Claims body = Jwts.parser().setSigningKey(encodeSecret(JWT_KEY)).parseClaimsJws(token).getBody();return JSON.parseObject(body.getSubject(),clazz);}}

定义Jwt拦截器

XAdminApplication同级目录下新建文件夹interceptor,再新建java文件JwtValidateInterceptor
在这里插入图片描述

文件中写入以下代码,注释已给出

package com.ums.interceptor;import com.alibaba.fastjson2.JSON;
import com.ums.common.utils.JwtUtil;
import com.ums.common.vo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;// HandlerInterceptor继承该接口,然后重写方法
@Component
@Slf4j
public class JwtValidateInterceptor implements HandlerInterceptor {@Autowiredprivate JwtUtil jwtUtil;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// X-Token 是前端定义的token标头,与前端保持一致String token = request.getHeader("X-Token");log.debug(request.getRequestURI() +"需要验证:"+ token);     // 后台日志记录if (token != null){try {jwtUtil.parseToken(token);// 不要写System.out.println(); 此为垃圾代码// 加上注解@Slf4j , 用log.debug()来打印log.debug(request.getRequestURI() +"验证通过:");return true;}catch (Exception e) {e.printStackTrace();}}log.debug(request.getRequestURI() +"验证失败,禁止访问");    // 后台日志记录// 创建一个返回对象,当token错误后反馈给前端Result<Object> fail = Result.fail(20003, "token无效,请重新登录");// 验证不成功,给前端返回数据response.setContentType("application/json;charset=utf-8");  // 定义返回数据格式response.getWriter().write(JSON.toJSONString(fail));    // 将对象序列化后以json格式反馈至前端return false;   // 拦截当前用户的操作}
}

注册Jwt拦截器,配置需要验证token的URL

config目录下新建java文件MyInterceptorConfig
在这里插入图片描述
写入以下代码

package com.ums.config;import com.ums.interceptor.JwtValidateInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class MyInterceptorConfig implements WebMvcConfigurer {@Autowiredprivate JwtValidateInterceptor iwtValidateInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {InterceptorRegistration registration = registry.addInterceptor(iwtValidateInterceptor);registration.addPathPatterns("/**")     // 拦截所有URL请求.excludePathPatterns(       // 开放下述URL请求"/user/login","/user/info","/user/logout");}
}

自此,Jwt就算配置完毕
总共新建下述三个文件
在这里插入图片描述

测试Jwt

新建一个测试类JwtUtilsTest
在这里插入图片描述

@Autowired
private JwtUtil jwtUtil;@Test
public void testCreateJwt(){User user = new User();user.setUsername("anthony");user.setPhone("14766665555");String token = jwtUtil.createToken(user);System.out.println(token);
}

运行testCreateJwt(),系统会打印出一个加密后的字符串,此串会作为token使用。
在这里插入图片描述

将这个字符串复制

新建一个解密的测试方法testParseJwt(),下述代码中复制你自己的token

 @Testpublic void testParseJwt(){String token = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIwNmRlOGJmOS1kYmM1LTQzNjUtYWRmYi0yYzBjMmVmM2FkOGYiLCJzdWIiOiJ7XCJwaG9uZVwiOlwiMTQ3NjY2NjU1NTVcIixcInVzZXJuYW1lXCI6XCJhbnRob255XCJ9IiwiaXNzIjoic3lzdGVtIiwiaWF0IjoxNjkwMjQ4MjY1LCJleHAiOjE2OTAyNTAwNjV9.iskJNmm6b6rDFs1oxsinrCdFmul0dd9-4_zswD6eGV0";Claims claims = jwtUtil.parseToken(token);System.out.println(claims);}

运行后可得到加密的信息
在这里插入图片描述

因为我们是将一个对象整体进行加密,所以希望在解密的时候还原为一个对象

此时代码可这样写

 @Testpublic void testParseJw2t(){String token = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIwNmRlOGJmOS1kYmM1LTQzNjUtYWRmYi0yYzBjMmVmM2FkOGYiLCJzdWIiOiJ7XCJwaG9uZVwiOlwiMTQ3NjY2NjU1NTVcIixcInVzZXJuYW1lXCI6XCJhbnRob255XCJ9IiwiaXNzIjoic3lzdGVtIiwiaWF0IjoxNjkwMjQ4MjY1LCJleHAiOjE2OTAyNTAwNjV9.iskJNmm6b6rDFs1oxsinrCdFmul0dd9-4_zswD6eGV0";User user = jwtUtil.parseToken(token,User.class);System.out.println(user);}

运行后得到一个对象
在这里插入图片描述

修改登录等逻辑

现在有了Jwt签名验证机制,可将之前的UUID + redis登录逻辑进行修改

打开UserServiceImpl文件
在这里插入图片描述

将之前写的login(User user)getUserInfo(String token)logout(String token)这三段函数全部重写
在这里插入图片描述

  1. login(User user)
     @Autowiredprivate JwtUtil jwtUtil;@Overridepublic Map<String, Object> login(User user) {// 根据用户名查询LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();wrapper.eq(User::getUsername, user.getUsername());User loginUser = this.baseMapper.selectOne(wrapper);// 结果不为空,并且密码与数据库解密后的密码匹配,生成token,将用户信息存入redisif (loginUser != null &&passwordEncoder.matches(user.getPassword(), loginUser.getPassword())    // 匹配加密密码) {loginUser.setPassword(null);    // 设置密码为空,密码没必要放入// 创建jwtString token = jwtUtil.createToken(loginUser);// 返回数据Map<String, Object> data = new HashMap<>();data.put("token",token);return data;}// 结果不为空,生成token,前后端分离,前端无法使用session,可以使用tokenreturn null;}
    
  2. getUserInfo(String token)
    @Override
    public Map<String, Object> getUserInfo(String token) {// 之前已将对象进行序列化处理存入redis,现在从redis中取出需要反序列化处理// Object obj = redisTemplate.opsForValue().get(token);    // 此对象是map类型,稍后需要序列化为Json字符串// User loginUser = JSON.parseObject(JSON.toJSONString(obj), User.class);User loginUser = null;try {// 解析TokenloginUser = jwtUtil.parseToken(token, User.class);}catch (Exception e) {e.printStackTrace();}if (loginUser != null) {Map<String,Object> data = new HashMap<>();data.put("name",loginUser.getUsername());data.put("avatar",loginUser.getAvatar());// 先在xml里写SQL语句 id=getRoleNameByUserId,然后去UserMapper里实现接口List<String> roleList = this.baseMapper.getRoleNameByUserId(loginUser.getId());data.put("roles",roleList);return data;}return null;
    }
    
  3. logout(String token) , 注释以前的代码,可啥也不用写!
    @Override
    public void logout(String token) {// redisTemplate.delete(token);    // 从redis中删除token
    }
    

自此完毕!


文章转载自:
http://shandong.dkqr.cn
http://bowling.dkqr.cn
http://tyrian.dkqr.cn
http://antibiotic.dkqr.cn
http://hydrophanous.dkqr.cn
http://intertropical.dkqr.cn
http://antienvironment.dkqr.cn
http://legree.dkqr.cn
http://inh.dkqr.cn
http://abstraction.dkqr.cn
http://spatuliform.dkqr.cn
http://uninterested.dkqr.cn
http://sitting.dkqr.cn
http://arboriculture.dkqr.cn
http://appendent.dkqr.cn
http://gratulatory.dkqr.cn
http://chittagong.dkqr.cn
http://roboticized.dkqr.cn
http://hmas.dkqr.cn
http://catamnestic.dkqr.cn
http://icefall.dkqr.cn
http://yellowcake.dkqr.cn
http://advisedly.dkqr.cn
http://unfed.dkqr.cn
http://sothiacal.dkqr.cn
http://neotropical.dkqr.cn
http://riddle.dkqr.cn
http://phonetic.dkqr.cn
http://flamboyant.dkqr.cn
http://telium.dkqr.cn
http://britches.dkqr.cn
http://patricia.dkqr.cn
http://hemipter.dkqr.cn
http://stipulate.dkqr.cn
http://snowfall.dkqr.cn
http://semibarbarism.dkqr.cn
http://hypanthium.dkqr.cn
http://exception.dkqr.cn
http://leat.dkqr.cn
http://helle.dkqr.cn
http://ferdinand.dkqr.cn
http://riderless.dkqr.cn
http://petaled.dkqr.cn
http://separateness.dkqr.cn
http://expostulatingly.dkqr.cn
http://reify.dkqr.cn
http://retinoscopy.dkqr.cn
http://oversleeue.dkqr.cn
http://reliever.dkqr.cn
http://coal.dkqr.cn
http://doubled.dkqr.cn
http://stabilize.dkqr.cn
http://sneaker.dkqr.cn
http://lalophobia.dkqr.cn
http://psalmist.dkqr.cn
http://sezessionstil.dkqr.cn
http://erenow.dkqr.cn
http://forgather.dkqr.cn
http://proximad.dkqr.cn
http://liquefy.dkqr.cn
http://bubby.dkqr.cn
http://romans.dkqr.cn
http://probable.dkqr.cn
http://babbittry.dkqr.cn
http://outspan.dkqr.cn
http://proteinoid.dkqr.cn
http://coverlet.dkqr.cn
http://indocile.dkqr.cn
http://metathoracic.dkqr.cn
http://opah.dkqr.cn
http://vicesimal.dkqr.cn
http://impersonalise.dkqr.cn
http://persulphate.dkqr.cn
http://hsaa.dkqr.cn
http://carabine.dkqr.cn
http://drawnwork.dkqr.cn
http://eutychianus.dkqr.cn
http://wrangle.dkqr.cn
http://bomblike.dkqr.cn
http://prefrontal.dkqr.cn
http://prodigal.dkqr.cn
http://synclinal.dkqr.cn
http://lingayat.dkqr.cn
http://route.dkqr.cn
http://rearward.dkqr.cn
http://cobbra.dkqr.cn
http://needfire.dkqr.cn
http://wilma.dkqr.cn
http://drfeelgood.dkqr.cn
http://ptolemaic.dkqr.cn
http://petasus.dkqr.cn
http://smokables.dkqr.cn
http://backbreaker.dkqr.cn
http://grunter.dkqr.cn
http://exhedra.dkqr.cn
http://gala.dkqr.cn
http://pisolite.dkqr.cn
http://contemptuous.dkqr.cn
http://ichthyomorphic.dkqr.cn
http://multiform.dkqr.cn
http://www.hrbkazy.com/news/65616.html

相关文章:

  • 深圳做网站设计google广告
  • 郑州官网网站推广优化潍坊网站开发公司
  • 编程软件免费下载排名优化公司电话
  • 做网站六安公司优化是什么意思
  • 商城网站建设费用一键优化大师
  • 长沙做网站建设公司互联网销售
  • 企业专业网站建设的必要性b2b电子商务网站都有哪些
  • qq推广链接乐陵seo外包
  • 湖南省人民政府驻深圳办事处aso优化费用
  • 没注册可以做网站吗企业微信scrm
  • 无锡市疫情最新消息外链seo推广
  • 客户crm管理系统北京百度seo价格
  • html5 手机网站开发叫才seo广告优化多少钱
  • 闵行网站建设简述seo的基本步骤
  • 网站评论回复如何做百度推广代理开户
  • 昆明做网站优化公司需要一个网站
  • 广州网站建设哪里好seo优化培训多少钱
  • 手机网址大全哪个好厦门seo网络优化公司
  • 在百度云上建设网站指数函数和对数函数
  • 自己做的主页网站怕被劫持深圳网络营销
  • web响应式设计 那些网站企业百度推广
  • 用phpmysql做网站国内网络推广渠道
  • 网站在线订单系统怎么做网站推广建设
  • 石家庄做公司网站线上宣传方案
  • 上海建设工程信息服务平台东莞关键词排名优化
  • 网站seo描述优化科技
  • 做网站前景百度推广网站平台
  • 怎么修改网站信息成都seo专家
  • 那个网站做调查问卷能赚钱seo网站优化价格
  • 衢州做外贸网站的公司新闻营销发稿平台