栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

vue+springboot 跨域跨 session+cookie失效失 问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

vue+springboot 跨域跨 session+cookie失效失 问题

主要介绍了前后端分离 vue+springboot 跨域 session+cookie 失效问题的解决方法,解决过程也很简单(该方法也适用于跨站请求) 首先登陆成功时将用户存在 session 中,后续请求在将用户从 session 中取出检查。后续请求取出的用户都为 null 。 首先发现 sessionID 不一致,导致每一次都是新的会话,当然不可能存在用户了。然后发现 cookie 浏览器不能自动保存,服务 器响应set-cookie 了 搜索问题,发现跨域,服务器响应的 setcookie 浏览器无法保存,而且就算保存了域名不同也不能携带。 第一步: 后台添加过滤器,因为前后端分离,不可能每个方法都写一遍,所以添加过滤器统一处理。
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter(urlPatterns = "
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws ServletException, IOException {
    HttpServletRequest req = (HttpServletRequest) servletRequest;
    HttpServletResponse resp = (HttpServletResponse) servletResponse;
    String origin = req.getHeader("Origin");//注意发布生产时不能这么写,得写死固定可以访问的域名,否则不安全
    if(origin == null) {
        origin = req.getHeader("Referer");
    }
    resp.setHeader("Access-Control-Allow-Origin", origin);//这里不能写*,
    *代表接受所有域名访问,如写*则下面一行代码无效。谨记
    resp.setHeader("Access-Control-Allow-Credentials", "true");//true代表允许携带cookie
    chain.doFilter(servletRequest,servletResponse);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}

springboot2.配置过滤器时,启动类必须加上@ServletComponentScan才会加载过滤器

然后前端配置
使用vue.resource发送请求时配置如下:
main.js中 Vue.http.options.xhr = { withCredentials: true }


使用vue.axios发送请求时配置如下:
axios.defaults.withCredentials = true;


jquery请求带上 xhrFields: {withCredentials: true}, crossDomain: true;
$.ajax({
type: "post",
url: "",
xhrFields: {withCredentials: true},
crossDomain: true,
data: {username:$("#username").val()},
dataType: "json",
success: function(data){ }
});
此时问题已解决。


如果还有问题,则是因为部分浏览器为了防止csrf等漏洞,需要设置samesite属性,像nodejs是是有专门的方法设置,然java后端的cookie现在还没有对应的设置方法,目前只能手动响应,代码如下
//cookie cookie1 = new cookie("test","test");
//cookie1.setPath("/");
//cookie1.setHttponly(true);
//response.addcookie(cookie1);
String header = response.getHeader("set-cookie");
response.setHeader("set-cookie",header+"; Secure; SameSite=None");

此解决方案:如果涉及到cookie无法设置过期时间,请留言。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/285250.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号