javaEE(3)

news2025/1/13 13:56:50

目录

一. 前端浏览器保存用户信息

二. 前端路由导航守卫

三. 路由嵌套 

四. web会话跟踪

1. web会话跟踪原理

2. JWT

2.1 传统的session认证

2.2 基于token的鉴权机制

2.3 jwt的构成

2.4 jwt搭建

五. 前端发送请求携带token

5.1 请求拦截器

六. 后端过滤器验证token

七. 前端响应拦截器 


一. 前端浏览器保存用户信息

在浏览器中保存用户信息分为

1. 会话存储:只在会话期间保存用户信息,一旦用户关闭浏览器,用户信息就会被销毁

this.$http.post("login","account="+this.account+"&password="+this.password).then((resp)=>{
	if(resp.data.code==200){
					 
//前端浏览器中存储用户信息

sessionStorage.setItem("account",resp.data.result.account); //会话期间存储,关闭浏览器就会销毁
sessionStorage.setItem("gender",resp.data.result.gender);
sessionStorage.setItem("phone",resp.data.result.phone);

     }
}

2.本地存储:可以长期保存用户信息,但会有风险

本地存储调用localStorage()即可,写法和会话存储相同

二. 前端路由导航守卫

前端路由守卫可以根据是否满足条件,从而进行相应的强制跳转,以登录为例子,如果该用户账号密码均正确才能来到后台操作,否则如果到后台页面了,但用户信息为空,那么路由导航守卫就会让你强制返回登录界面,该功能可以在index.js中配置

rout.beforeEach((to,from,next)=>{
	 
     if(to.path=='/login'){  //如果访问的是登录页面,直接放行,允许访问
        return next();
      }else{  //访问的是其他后端页面,要判断
           var account = sessionStorage.getItem("account");
           if(account==null){  //如果账号为空,回到登录页面
               return next("/login");
            }else{  //账号不为空,放行,允许访问
                next();
              }
        }
  })

三. 路由嵌套 

当我们想在一个页面的某些区域进行页面跳转时,就要用到路由嵌套

在index.js中,找到主页面的路由,在里面定义一个children属性,将想在该页面跳转的子路由定义在里面即可

/* 定义组件路由 */
 var rout = new router({
    routes: [
    {
	   path:'/',
	   component: Login
    },
    {
      path: '/login',
      component: Login
    },
   //这个是路由嵌套
    {
      path: '/main',
      component: Main,
      children:[
      {
        path:'/majorlist',
        component:MajorList
      },
	  {
	    path:'/studentlist',
	    component:StudentList
	  }
      ]
    }
    ]
 });

配置好这个还需要在主页面的.vue文件中修改三个地方

四. web会话跟踪

由于http请求是无状态的,这就导致每次发来的请求后端给响应之后,这次交互就结束了,当下次同一个人再来请求时,服务器也无法认出是哪一个用户,这就会导致用户在进行操作时,我们不知道是哪个用户做的,所以我们需要一种手段,来明确本次操作是哪个用户在操作

1. web会话跟踪原理

当前端第一次发来请求时,后端验证账号密码均正确,然后给前端发送一个令牌(令牌中存有用户信息),前端将其保存下来,之后每次发送请求时,都要携带该令牌,后端在响应前会先根据令牌确认身份,如果令牌验证不符合,直接强制退回登录界面,令牌验证成功,我们可以根据令牌得到用户信息,就知道是哪个用户在进行操作了

2. JWT

jwt(json web token):用来生成token的一种方式,一种可以携带用户信息,并且可以设置秘钥加密的字符串,是安全的

2.1 传统的session认证

我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一次进行用户认证才行,因为根据http协议,我们并不能知道是哪个用户发出的请求,所以为了让我们的应用能识别是哪个用户发出的请求,我们只能在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样我们的应用就能识别请求来自哪个用户了,这就是传统的基于session认证。

但是这种基于session的认证使应用本身很难得到扩展,随着不同客户端用户的增加,独立的服务器已无法承载更多的用户,而这时候基于session认证应用的问题就会暴露出来.

缺点:

  1. 1.用户数量多,服务器压力变大
  2. 2.扩展性差
  3. 3.容易被伪造攻击
  4. 2.2 基于token的鉴权机制

  5. 过程就是上面说的web会话跟踪的原理:
  6. 1. 用户使用账号和密码发出post请求
  7. 2. 服务器使用私钥创建一个jwt
  8. 3. 服务器返回这个jwt给浏览器
  9. 4. 浏览器将该jwt串在请求头中像服务器发送请求
  10. 5. 服务器验证该jwt
  11. 6. 返回响应的资源给浏览器

2.3 jwt的构成

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

这就是一个完整的jwt,它是由三部分组成的每个部分以.结束

第一部分(header):主要是声明类型和加密方式,这部分没有加密,只是通过base64进行了转码

第二部分(playload): 存储部分用户信息,该部分也没有加密,只是通过base64进行了转码

第三部分(signature):主要是签证信息,这部分通过上面两部分的base64转码拼接起来,再加上header中声明的加密方式,对其进行加密,就得到了第三部分

补充:base64是一种编码方式,将普通的符号码值按照6位一遍码,重新得到自己编码表中的符号

2.4 jwt搭建

1. 在maven项目中的pom.xml文件中注入如下依赖

<dependency>
  <groupId>com.auth0</groupId>
  <artifactId>java-jwt</artifactId>
  <version>3.8.2</version>
</dependency>

 2. 创建token生成方法

创建一个类专门用来管理token,不用我们自己写

 public static String getToken(User u) {
        String token = "";
        try {
            //过期时间 为1970.1.1 0:0:0 至 过期时间  当前的毫秒值 + 有效时间
            Date expireDate = new Date(new Date().getTime() + 10*1000);
            //秘钥及加密算法
            Algorithm algorithm = Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE");
            //设置头部信息
            Map<String,Object> header = new HashMap<>();
            header.put("typ","JWT");
            header.put("alg","HS256");
            //携带id,账号信息,生成签名
            token = JWT.create()
                    .withHeader(header)
                    .withClaim("id",u.getId())
                    .withClaim("account",u.getAccount())
                    .withExpiresAt(expireDate)
                    .sign(algorithm);
        }catch (Exception e){
            e.printStackTrace();
            return  null;
        }
        return token;
    }

3. 验证token是否有效的方法,不用自己写

/**
* 验证token是否有效
* @param token
* @return
*/
    public static boolean verify(String token){
        try {
            //验签
            Algorithm algorithm = Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE");
            JWTVerifier verifier = JWT.require(algorithm).build();
            DecodedJWT jwt = verifier.verify(token);
            return true;
        } catch (Exception e) {//当传过来的token如果有问题,抛出异常
            return false;
        }
    }

4. 获取token中用户信息的那部分

    /**
     * 获得token 中playload部分数据,按需使用
     * @param token
     * @return
     */
    public static DecodedJWT getTokenInfo(String token){
        return JWT.require(Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE")).build().verify(token);
    }

五. 前端发送请求携带token

按理说,我们应该在每次发送get请求或post请求时将token信息拼接在请求时的信息中,但这样会很麻烦,我们每发送一个请求都要拼接一次,万一我本来的请求信息就很多,还要再拼接一个岂不是更麻烦,所以这里我们可以进行一个配置

5.1 请求拦截器

为了避免每次都要自己携带token信息,前端可以在发送请求时添加一个请求拦截器,这样我们在发送请求时,就会自动执行请求拦截器中的内容,将我们的token携带在请求头中,由浏览器自己携带过去,后端只需要调用getHeader方法就能获得token信息

 //axios 请求拦截

 axios.interceptors.request.use(config =>{
  //为请求头对象,添加Token验证的token字段
 config.headers.token = sessionStorage.getItem('token');
  return config;
  })

六. 后端过滤器验证token

我们知道前端发送的请求中携带了token,那么我们后端就要对token进行验证,如果不正确,给前端响应回去一个标准json格式,前端再拿到状态码时就可以强制回到登录界面,但是我们不可能给每一个servlet程序都写一遍验证的过程,这样太重复且麻烦了,我们只需要定义一个过滤器专门用来验证token是否正确即可

import com.fasterxml.jackson.databind.ObjectMapper;
import com.ffyc.dormServer.model.Result;
import com.ffyc.dormServer.util.JWTUtil;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@WebFilter(urlPatterns = "/api/*")
public class TokenFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {


        HttpServletRequest request = (HttpServletRequest) servletRequest; //向下转型
        String token = request.getHeader("token"); //接收请求头中的token
        boolean verify = JWTUtil.verify(token);
        if(verify){ //验证成功,继续向后执行,到达目标servlet程序
            filterChain.doFilter(servletRequest, servletResponse);
        }else{ //验证失败,向前端响应401
            Result result = new Result(401, "token验证失败", null);
            servletResponse.getWriter().write(new ObjectMapper().writeValueAsString(result));
        }


    }
}

这样前端收到响应后就可以做出对应的操作

七. 前端响应拦截器 

当前端收到后端响应回来的数据时,我们可以根据状态码来作出对应的判断,但我们知道当返回500表示后端出异常,401表示token验证失败返回到登录界面,这两个状态码所要做的事情都是相同的,我们没必要在每一次接收响应时都写一遍,只需要写每次收到200时,要做的事就可以,所以前端为我们提供了一个响应拦截器,当我们每次收到后端的响应时,就可以先通过拦截器判断状态码是不是500或401如果是就不用响应到前端,直接在拦截器作出响应操作,如果是200才在前端做出具体操作

   // 添加响应拦截器
  axios.interceptors.response.use((resp) =>{//正常响应拦截
    if(resp.data.code==500){
       ElementUI.Message({message:resp.data.desc,type:"error"})
    }
	
   if(resp.data==401){
   ElementUI.Message({message:resp.data.desc,type:"warning"})
   router.replace("/login");
   }
   
   return resp;
   
   });

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1959285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot合肥师范学院实习实训管理系统-计算机毕业设计源码31290

摘要 随着社会对高校毕业生的职业素养和实践能力要求不断提高&#xff0c;高校实习实训教育愈发受到重视。信息化技术的快速发展也为高校教学管理带来了新的机遇。合肥师范学院实习实训管理系统的研究就是源自当前高等教育对学生实习实训管理的需求。 实习实训管理系统充分利用…

手机录屏直播,教你3个方法,秒变录屏高手

在移动互联网飞速发展的今天&#xff0c;手机录屏直播已成为越来越多用户分享内容、交流心得的重要方式。无论是游戏高手展示高超技艺&#xff0c;还是教育从业者进行远程授课&#xff0c;手机录屏直播都能提供极大的便利。 在手机录屏的世界里&#xff0c;安卓手机和苹果手机…

深入分析 Android ContentProvider (九)

文章目录 深入分析 Android ContentProvider (九)ContentProvider 的高级使用及最佳实践&#xff08;续&#xff09;1. 复杂查询与联合查询复杂查询示例 2. 数据同步与一致性示例&#xff1a;使用事务确保数据一致性 3. 数据分页加载示例&#xff1a;分页加载数据 4. 内容提供者…

jmeter录制

1、添加代理服务器 添加方法&#xff1a;“测试计划”右键 -> 添加 -> 非测试元件 -> HTTP代理服务器 2、添加线程组 添加方法&#xff1a;“测试计划”右键->添加->线程&#xff08;用户&#xff09;->线程组 3、配置http代理服务器 &#xff08;1&a…

电脑录屏软件带声音,3款软件推荐,一键录制

在今天&#xff0c;电脑录屏软件带声音的功能已经悄然改变了我们的学习、工作和娱乐方式。录屏软件&#xff0c;这个看似简单的工具&#xff0c;实则蕴藏着无穷的魅力。它不仅能够捕捉屏幕上的每一个细节&#xff0c;还能将声音完美地融入其中。无论是游戏中的背景音乐、会议中…

谷粒商城实战笔记-77-商品服务-API-平台属性-规格参数列表

文章目录 一&#xff0c;新增product/attr/base/list接口二&#xff0c;踩坑记录1. 使用 Lazy 注解2. 使用 PostConstruct 注解代码分析解决方案分析 这一节的主要内容是完成规格参数的列表查询功能。 一&#xff0c;新增product/attr/base/list接口 这个接口用来查询规格参数…

电力巡检红外热成像夜视手持终端有多强?

电力巡检红外热成像夜视手持终端在电力巡检中展现出强大的功能和应用价值。这些手持终端结合了红外热成像技术和夜视功能&#xff0c;能够在夜间或光线不足的环境下对电力设备进行精确的温度测量和状态监测。以下是对其强大之处的详细分析&#xff1a; 1. 精准的红外热成像能力…

【机器学习】正规方程的简单介绍以及如何使用Scikit-Learn实现基于正规方程的闭式解线性回归

引言 Scikit-learn 是一个开源的机器学习库&#xff0c;它支持 Python 编程语言。它提供了多种机器学习算法的实现&#xff0c;并用于数据挖掘和数据分析 文章目录 引言一、正规方程的定义二、正规方程的原理三、使用 Scikit-Learn 实现基于正规方程的闭式解线性回归3.1 工具3.…

爬虫“拥抱大模型”,有没有搞头?

验证码坐标识别 数据采集过程中&#xff0c;可能会碰到各种风控策略。其中&#xff0c;验证码人机验证是较为常见的&#xff0c;点选类验证码需要识别出相应的坐标&#xff0c;碰到这种情况&#xff0c;一般要么自己训练模型&#xff0c;要么对接打码平台。现在也可以将识别工…

RocketMQ事务消息机制原理

RocketMQ工作流程 在RocketMQ当中&#xff0c;当消息的生产者将消息生产完成之后&#xff0c;并不会直接将生产好的消息直接投递给消费者&#xff0c;而是先将消息投递个中间的服务&#xff0c;通过这个服务来协调RocketMQ中生产者与消费者之间的消费速度。 那么生产者是如何…

领夹麦哪个牌子音质好?直播采访十大公认音质好的麦克风!

在追求内容品质的今天&#xff0c;音频质量成为了衡量作品成功与否的关键指标之一。对于频繁出镜的互联网从业者、短视频创作者及直播达人而言&#xff0c;一款性能卓越的无线领夹麦克风无疑是提升专业形象的得力助手。它不仅轻便易携&#xff0c;更能在复杂环境中捕捉纯净、清…

[QT开发_音乐播放器项目笔记01]

目录 一&#xff1a;常用类 26 QByteArray 是 Qt 框架中的一个类&#xff0c;用于处理字节数组。它提供了动态大小的字节数组&#xff0c;可以用于存储和操作二进制数据&#xff0c;比如文件内容、网络数据等。 QT项目记录&#xff1a; 一&#xff1a;常用类 26 QByteArray…

capl代码写法

CAPL是一种专门用于构建通信系统测试脚本的编程语言&#xff0c;全称为"Communication Access Programming.Language"。 CAPL是一种类C语言的解释性脚本语言&#xff0c;常用于CAN和LIN总线等通信系统的开发和测试中。 CAPL提供了丰富的库函数和API&#xff0c;可以用…

【Spring Cloud】Sleuth +Zinkin 实现链路追踪并持久化的解决方案

文章目录 前言链路追踪介绍Sleuth入门Sleuth介绍TraceSpanAnnotation Sleuth入门1、引入依赖2、修改配置文件3、网关路由配置4、演示 Zipkin的集成ZipKin介绍ZipKin服务端安装Zipkin客户端集成1、添加依赖2、添加配置3、访问微服务4、演示 Zipkin数据持久化使用mysql实现数据持…

vue3.0学习--创建项目,基于vite创建

vite 官网地址&#xff1a;https://cn.vitejs.dev/guide/ 1&#xff0c;执行创建命令 npm create vitelatest 2, cd my3d ---- my3d 是创建的项目名字 3&#xff0c;npm install ---- 安装需要的插件包 4&#xff0c;npm run format ---- 通常用于代码格式化 5, npm…

【Docker】Docker 的背景

一、容器技术发展史 1、Jail 时代 容器不是一个新概念或者新技术&#xff0c;很早就有了&#xff0c;只是近几年遇到了云计算&#xff0c;整个技术被彻底引爆了。 &#xff08;1&#xff09;1979 年贝尔实验室发明 chroot chroot 系统调用是在 1979 年开发第 7 版 Unix 期间…

Java多重循环控制,break,continue,return

目录 1.多重循环控制 执行步骤分析 案例演示 2.跳转控制语句-break 基本介绍 基本语法 示意图 注意事项和细节说明 练习题 3.跳转控制语句-continue 基本介绍 基本语法 示意图 细节案例分析和说明 4.跳转控制语句-return 介绍 1.多重循环控制 执行步骤分析…

django基于大数据的电影推荐系统-计算机毕业设计源码71246

目 录 摘 要 1 绪论 1.1 选题背景与意义 1.2研究现状 1.3研究内容 1.4 开发环境 1.5论文结构与章节安排 2 相关理论和技术 2.1 协同过滤算法 2.2 B/S体系结构介绍 2.3 Python爬虫技术 2.4 Django框架介绍 2.5 MySQL数据库 3 电影推荐系统系统分析 3.1 可行性分析…

微信小程序审核的一些总结记录

1、文字ocr识别工具&#xff0c;识别ocr文字&#xff0c;显示出文字 这么简单的东西&#xff0c;说是“涉及提供图片/音频/制作、剪辑服务”&#xff0c;这个工具代码也就下图几行&#xff0c;这是哪门子的图片编辑&#xff0c;别管它&#xff0c;直接重新提交审核。 2、个人不…

营销人看巴黎奥运会,看到了什么?

不同的人眼中的巴黎奥运会是不一样的&#xff1a;环保人士关注奥运场馆的绿色设计&#xff0c;以及赛事期间对可再生能源的利用&#xff1b;旅游博主用镜头捕捉巴黎奥运会每一个精彩瞬间&#xff1b;社会学家在巴黎奥运会看到多元文化的交流与融合…… 那么营销人在巴黎奥运会…