第一次项目搭建笔记&路由导航守卫&web前后端会话跟踪

1.重新搭建后端项目

在IDEA中重新创建一个JavaEE项目,记得勾选Web profile

之后在java文件中重新搭建分级的文件夹

按照标准创建com.xxxx.dorm文件夹并创建dao(数据处理),filter(过滤器),model(模型),util(工具),web(服务端)等文件夹进行不同功能部分的分类

在这里插入图片描述

搭建完基本的框架后一步步根据需求丰富功能即可,记得要把servlet和过滤器进行注册,一般会固定的设置基础的编码过滤器和跨域过滤器

编码过滤器和跨域过滤器

public class CorsFilter implements Filter {
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
        HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
        //允许携带Cookie时不能设置为* 否则前端报错
        httpResponse.setHeader("Access-Control-Allow-Origin", httpRequest.getHeader("origin"));//允许所有请求跨域
        httpResponse.setHeader("Access-Control-Allow-Methods", "*");//允许跨域的请求方法GET, POST, HEAD 等
        httpResponse.setHeader("Access-Control-Allow-Headers", "*");//允许跨域的请求头
        httpResponse.setHeader("Access-Control-Allow-Credentials", "true");//是否携带cookie

        filterChain.doFilter(servletRequest, servletResponse);
    }
}
public class EncodingFilter implements Filter {

    String reqencod = "";
    String respencod = "";

    /*
    * 初始化过滤*/
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化过滤器");
        reqencod = filterConfig.getInitParameter("reqencod");
        respencod = filterConfig.getInitParameter("respencod");
        System.out.println(reqencod);
        System.out.println(respencod);
    }

    @Override
    public void destroy() {
        System.out.println("销毁过滤器");
    }

    /*
    * 执行过滤操作的方法*/
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //设置请求字符集
        servletRequest.setCharacterEncoding(reqencod);
        //设置相应字符集
        servletResponse.setContentType(respencod);
        //让请求离开过滤器继续向下执行,下一个可能是过滤器,也可能是目标servlet
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

在web.xml中注册过滤器和服务器

<!--    注册登录servlet-->
    <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>com.george.dorm.web.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>
    
    
<!--    编码过滤器-->
    <filter>
        <filter-name>encodFilter</filter-name>
        <filter-class>com.george.dorm.fillter.EncodingFilter</filter-class>
        <init-param>
            <param-name>reqencod</param-name>
            <param-value>utf-8</param-value>
        </init-param>
        <init-param>
            <param-name>respencod</param-name>
            <param-value>text/html;charset=utf-8</param-value>
        </init-param>
    </filter>
<!--    编码过滤器映射-->
    <filter-mapping>
        <filter-name>encodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
<!--    跨域过滤器-->
    <filter>
        <filter-name>corsFilter</filter-name>
        <filter-class>com.george.dorm.fillter.CorsFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>corsFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>xm'l

之后要在Tomcat中部署项目

在这里插入图片描述

在这里插入图片描述

2.运行前端项目

前端在之前已经提前搭建好了,只需要在原有的基础上进行微调即可

3.登录向后端发送请求

使用axios发送异步请求

首先需要在vue项目中安装axios

安装axios

安装axios需要在此vue项目的终端中输入

npm install axios

如果没有配置镜像文件可能会下载的很慢甚至不下载,所以此时需要配置npm的镜像文件

国内的npm镜像源有以下几种:

npm 官方原始镜像网址是:https://registry.npmjs.org/
淘宝 NPM 镜像:http://registry.npmmirror.com
阿里云 NPM 镜像:https://npm.aliyun.com
腾讯云 NPM 镜像:https://mirrors.cloud.tencent.com/npm/
华为云 NPM 镜像:https://mirrors.huaweicloud.com/repository/npm/
网易 NPM 镜像:https://mirrors.163.com/npm/

如何使用镜像源:

想要使用哪个镜像就通过 npm config set registry + 对应的镜像网址就好了

以华为云为例:

npm config set registry https://mirrors.huaweicloud.com/repository/npm/

安装好后检查当前的镜像源是否切换

npm config get registry

在这里插入图片描述

出现如图的结果则证明镜像源切换完毕

之后再通过npm install axios就可以很快速的下载好axios了

下载好之后在main.js中导入axios

// 导入axios
import axios from 'axios';
//定义后端基本地址   后续发送请求时,只需要写servlet地址即可,会自动将这部分拼接过去
axios.defaults.baseURL="http://192.168.124.26:8899/dorm/"
//将axios挂载到vue对象中
Vue.prototype.$http=axios;

4.后端创建搭建LoginServlet

接收请求数据

调用其他程序处理(jdbc)

向前端做出响应

5.前端接收响应,根据响应做出处理

在浏览器存储当前登录的管理员信息

跳转到main组件

取出并展示管理员信息

安全退出,清除浏览器中的管理员信息,跳转到登录组件

6.前端添加一个路由导航守卫

//配置路由导航守卫, 每当进行一次组件路由时,自动执行此段代码
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();
		}
	 }
})

7.web前后端之间的会话跟踪

当我们登录成功后,在管理系统中继续其他操作(例如查询自己的成绩)

当我们的请求发送到后端后,后端程序默认不知道本次请求是谁发送的

因为http请求是无状态的,不携带用户信息的,当用户登录成功后.此后再次与服务器交互时,服务器并不知道是哪个用户发送的请求,在web开发中必须解决此问题(之后的请求,还需要让后端知道是哪个账号发送的请求)

在这里插入图片描述

具体实现

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

使用jwt为管理员生成token字符串,可以携带管理员信息,并且可以加密存储

JWT生成的token有三部分

1,声明:生成类型,加密算法

2,载荷:管理员信息(id,账号,头像)

3,签证:结合前两部分,密钥,加密生成的(最重要的)

2.浏览器中储存token

储存的token用于实时验证身份,在不同的操作中都需要验证

3.之后的请求把token携带一起发向后端

axios请求拦截器

把后端验证token的代码提取到一个过滤器中(登录不能进入过滤器)

可以将过滤器的范围设置为某个目录下的所有地址,只需要将login以外的所有地址都放在这个地址之下就可以实现除login之外所有操作均验证token,在过滤器中将token验证失败的情况设置成一种result,错误码设置为401,axios响应拦截器,对错误码为401的情况进行拦截响应

axios响应拦截器

拦截后端响应 把500 401状态码统一拦截

// 添加响应拦截器
axios.interceptors.response.use((resp) =>{//正常响应拦截
if(resp.data.code==500){
ElementUI.Message({message:resp.data.message,type:"error"})
}
if(resp.data==401){
router.replace("/login");
}
return resp;
});
  • 17
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值