前沿

后台的JAVA框架时在前后端没有分离的时候编写的,因为修改起来工程量比较庞大同时也很复杂,所以现阶段只是将前端用vue来重写项目框架,来减轻项目的运行负担。在与后台结合的时候还是会出现一些运行冲突而出现问题的状况。

问题说明

当cookie中的tooken过期或者cookie中没有信息的时候,正常启动项目之后在浏览器输入http://localhost:8080,应该被重定向到http://localhost:8080/login?redirect=%2Fsystem,但是实际情况浏览器的URL的地址为,http://localhost:8081/;jsessionid=XXX,后台不能跳转到他想要显示的登录页,而前端的路由又找不到相对应的页面而走向404页面。

问题原因

因为之前的项目时通过后台来进行页面的权限设置的,采用shiro进行权限控制,并且设置了setLoginUrl。其运行机制如下:

1.client向server发送请求http://localhost:8080
2.server端经由shiro进行内部内部URL重定向至http://localhost:8080/login?redirect=%2Fsystem
3.server收到http://localhost:8080/login?redirect=%2Fsystem请求后,发现请求头中没有cookie(因为这次请求是server内部重定向的),那么server就认为client端禁用了cookie,并且为这次会话产生唯一标示即SESSIONID,并将SESSIONID追加到http://localhost:8080/,作为response响应给client。
4.client收到server的响应后,以http://localhost:8080/;JSESSIONID=XXX 为URL进行请求重定向(上图中302是重定向的状态码),最后展示出登陆页。
5.提交登陆信息后,server从请求信息中发现了cookie(因为这次请求是client发出的而非server内部重定向),会认为client没有禁用cookie,就不会进行URL重定向,而是将SESSIONID放入cookie之中,所以之后的请求URL就无需追加URL,如果此时手动删除client端的cookie,重新请求http://localhost:8080,就会发现SESSIONID再一次被追加到了URL后面。

问题解决

由于现在后端代码不能轻易更改,遂决定在前端页面的路由跳转出进行一个阻塞判断,当遇到路由中包含JSESSIONID信息时,跳转到登录页进行登录。

router.beforeEach((to, from, next) => {
  if(to.path.indexOf('jsessionid')!=-1){
     next('/login');
  }
})

问题延伸

1.HTTP 302 的跳转目标是在哪里看出来的?
在这里插入图片描述如上图所示,他的跳转目标应为location中的地址。

2.301 302 307 的区别是什么?

301重定向是永久的重定向(HTTP/1.1 301 Moved Permanently),比较常用于场景是使用域名跳转。搜索引擎在抓取新内容的同时也将旧的网址替换为重定向之后的网址。例如:我们访问 http://www.baidu.com 会跳转到 https://www.baidu.com,发送请求之后,就会返回301状态码,然后返回一个location,提示新的地址,浏览器就会拿着这个新的地址去访问。使用301重定向对搜索引擎比较友好。

302跳转是暂时的跳转(HTTP/1.1 302 Moved Temporarily),登陆的用户访问用户中心重定向到登录页面。搜索引擎会抓取新的内容而保留旧的网址。因为服务器返回302代码,搜索引擎认为新的网址只是暂时的。程序员默认使用302跳转。

307跳转时对302的细化(HTTP/1.1 307 Temporary Redirect),它可以传递POST值,但是不传递GET值。在307跳转中,因为会转移_POST值,可以用于表单第三方表单验证。状态码 307 与 302 之间的唯一区别在于,当发送重定向请求的时候,307 状态码可以确保请求方法和消息主体不会发生变化。使用非 GET 请求方法而返回 302 状态码,Web 应用的运行状况是不可预测的;而返回 307 状态码时则是可预测的。307只会出现在高级程序员那里使用。

以上为问题总结,如有错误之处,欢迎指出。

本文问题原因处,参考自
https://blog.csdn.net/qq_32891219/article/details/83024559

Logo

前往低代码交流专区

更多推荐