JavaEE(3)

业务分析

    市场

    提出需求

    设计

    编码

    测试

    运维
 

项目搭建步骤

1.搭建后端项目

2.登录向后端发送请求

    使用axios发送异步请求

    在vue项目中安装axios

在终端输入 npm install axios  安装

    更换npm镜像源,可参考下面的博客

【npm】npm镜像源切换合集_npm 镜像-CSDN博客

3.登录成功后,在前端获取到后端响应的信息

前端存储用户信息

1.sessionStorage.setItem("  ",  "  ");

会话期间存储,关闭浏览器后,数据就会销毁

2.localStorage.setItem("  ", "  ");

本地存储,即使关闭浏览器,下次打开时还是存在,可以长久保存 

3.document.cookie

4.在前端判断用户是否登录,添加路由导航守卫

配置路由导航守卫, 每当进行一次组件路由时,自动执行此段代码

rout.beforeEach((to,from,next)=>{
    if(to.path=='/login'){ //to.path 访问的路由地址
         return next();//继续正常访问目标地址
    }else{
        var account = sessionStorage.getItem("account");//获取到浏览器中存储的管理员信息
        if(account==null){ //如果信息为空,说明没有登录
          return next("/login");
        }else{//说明已经登录,可以正常访问
          return next();
        }
     }
})

    目前除了访问login.vue不需要登录,除此之外的组件都必须是登陆后才能访问

作用:使用的vue-router中的路由导航守卫,在前端每次发生路由跳转时会触发拦截,判断访问哪些组件,哪些组件需要登录,哪些组件不需要登录

5.路由嵌套

    在main路由下嵌套其他路由

import Main from '../Main.vue'; /* 导入其他组件 */
import MajorList from '../views/major/MajorList';
import StudentList from '../views/student/StudentList';
import BuildList from '../views/build/BuildList';

Vue.use(router)
/* 定义组件路由 */
var rout = new router({
	routes: [
		{
			path: '/main',
			component: Main,
			children:[
				{path: '/majorlist',component: MajorList},
				{path: '/studentlist',component: StudentList},
				{path: '/buildlist',component: BuildList},
			]
		},
    ]
});

6.后端判断用户身份

    登录后,在管理系统中对继续其他操作()

    当我们的请求发送到后端,后端默认不知道本次请求是谁发送的,因此才有了会话跟踪

7.web会话跟踪

    因为http请求是无状态的,不携带用户信息,一次请求响应结束后就结束了,下一次再向服务器端发送请求,服务器并不知道是谁向他发送的

    所以在web开发中,必须要解决此问题,(之后的请求需要让后端知道是哪个账号发送的请求)
对整个会话过程进行跟踪

1.当登录时,后端验证账号密码是否正确,如果账号正确,就需要在后端为当前登录的用户生成一个令牌(token),将令牌信息响应给前端

2.前端存储token

3.后面每次从前端向后端发送请求,都要携带token

4.后端验证令牌,如果令牌有效继续向后执行,如果令牌无效向前端响应认证失败

JavaEE(3)_第1张图片

实现步骤

1.登录成功后,在后端为用户生成一个称为token的字符串(token令牌)

使用jwt生成一段带有用户信息的

JWT(Json web token)

JWT就是用来生成token的一种方式,一种可以携带用户信息,并且可以设置秘钥加密的字符串,是安全的.

session认证,是将用户信息存储在服务器端,有两个缺点:1.占用服务器内容2.分布式项目中,不灵活

JWT的构成
第一部分

header

jwt的头部承载两部分信息:

声明类型,这里是jwt

声明加密的算法 通常直接使用 HMAC HS256

第二部分

playload

载荷就是存放有效信息的地方。这些有效信息包含三个部分

标准中注册的声明

公共的声明

    公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务   需要的必要信息.但不建议添加敏感信息(例如密码),因为该部分在客户端可解密. id,用户名,头像名

私有的声明

第三部分

signature

jwt的第三部分是一个签证信息,这个签证信息由三部分组成:

header (base64后的) + payload (base64后的) + secret

这个部分需要base64转码后的header和base64转码后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

2.浏览器在存储token
3.之后的请求,把token携带着,一起向后端发送

axios请求拦截器,写在main.js中,每当我们使用axios框架向后端发送请求时,都会经过拦截器

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

把后端验证token的代码提取到一个过滤器中

package com.ffyc.dormserver.filter;

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;
import java.io.PrintWriter;

/*
    验证token是否有效
    请求地址中有api前缀的,
*/
@WebFilter(urlPatterns = "/api/*")
public class TokenFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println(123);
        HttpServletRequest request = (HttpServletRequest)servletRequest;//向下转型
        String token = request.getHeader("token");//从请求头中拿到token
        //验证token
        boolean res = JWTUtil.verify(token);
        System.out.println(res);
        if(res){//token验证成功,继续向后执行,到达目标servlet程序
            filterChain.doFilter(servletRequest, servletResponse);
        }else {//token验证失败,向前端响应401,401权限认证失败
            Result result = new Result(401,"token认证失败",null);
            PrintWriter printWriter = new PrintWriter(servletResponse.getWriter());
            printWriter.write(new ObjectMapper().writeValueAsString(result));
        }
    }
}

你可能感兴趣的:(java-ee,java)