跨域访问sessionid不一致问题
在开发过程中遇到这么一个问题,让我花了一个下午的大好时光才解决。但是解决玩之后,发现那么的容易。就是查找资料的时候很费劲。这里把问题记录一下。
问题的产生
- 流程是这样的,要做一个用户登录的接口。在登录页面,前端先请求验证码,然后输入用户名密码和验证码之后,请求登录接口。
- 这里存在两个接口,验证码接口和登录接口。在验证码接口中我用session保存验证码,在登录接口中我从session取出验证码进行校验。
两个接口的代码如下:
@RequestMapping("/getImageCode")
public void getImageCode(HttpServletRequest request,
HttpServletResponse response) throws IOException {
response.setDateHeader("Expires", 0);
response.setHeader("Cache-Control",
"no-store, no-cache, must-revalidate");
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache");
response.setContentType("image/jpeg");
String capText = captchaProducer.createText();
request.getSession().setAttribute(Constants.KAPTCHA_SESSION_KEY,capText);
logger.info("code is "+capText+" session id is "+request.getSession().getId());
BufferedImage bi = captchaProducer.createImage(capText);
ServletOutputStream out = response.getOutputStream();
ImageIO.write(bi, "jpg", out);
try {
out.flush();
} finally {
out.close();
}
}
@RequestMapping(value = "/login",method = RequestMethod.POST)
public ModelMap login(HttpServletRequest request){
ModelMapHelper helper = new ModelMapHelper();
String userName = request.getParameter("userName");
String password = request.getParameter("password");
String imgCode = request.getParameter("imageCode");
String sessionCode = (String) request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
logger.info("input code is "+imgCode+" session id is "+request.getSession().getId());
if(StringUtils.isEmpty(imgCode)){
helper.setErrorMap("验证码不能为空");
return helper;
}
if(!imgCode.equals(sessionCode)){
helper.setErrorMap("验证码不正确");
return helper;
}
try {
User user = userService.checkLogin(userName, password);
if (user == null) {
helper.setErrorMap("用户名或密码错误");
return helper;
}
helper.setSuccessMap("登录成功");
helper.setData(user);
request.getSession().setAttribute("user",user);
}catch (GeneralException g){
g.printStackTrace();
logger.warn(g.getMessage(),g);
helper.setErrorMap(g.getMessage());
}catch (Exception e){
e.printStackTrace();
logger.error("查询失败",e);
helper.setInternalErrorMap();
}
return helper;
}
*经过postman工具简单的接口测试之后,没有问题。但是与前端进行接口联调的时候发现了问题。
两次获取的sessionid不一致,导致在登录时候,没有获取session中的验证码!
查找原因
百思不得其解!为什么用postman测试是正常的呢?而与前端联调就有这种问题。
原来后台是做了一个跨域访问的设置
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
// 设置跨域访问
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "HEAD", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "TRACE")
.allowCredentials(true);
}
}
主要解释如下:
registry.allowedOrigins(““)设置跨域访问的域名,如果是,默认都可以访问。
这个方法是后来找到问题后,自己加上去的
registry.allowCredentials(true)设置是否允许客户端发送cookie信息。默认是false
具体关于这些头信息的解释可以参考:
http://www.ruanyifeng.com/blog/2016/04/cors.html
解决问题
其实最后就做了两件事情,
1. 服务端设置可以接收cookie信息
registry.allowCredentials(true)
- 在ajax请求中设置发送cookie信息
$.ajax({
url: a_cross_domain_url,
xhrFields: {
withCredentials: true
}
});
再看看结果,sessionid就一致了。
参考的博客:
https://segmentfault.com/q/1010000002905817
原文地址:https://blog.csdn.net/qq_27373459/article/details/77099207
跨域访问sessionid不一致问题的更多相关文章
- 解决ajax跨域访问sessionid不一致问题
根据浏览器的保护规则,跨域的时候我们创建的sessionId是不会被浏览器保存下来的,这样,当我们在进行跨域访问的时候,我们的sessionId就不会被保存下来,也就是说,每一次的请求,服务器就会以为 ...
- 解决vue+springboot前后端分离项目,前端跨域访问sessionID不一致导致的session为null问题
问题: 前端跨域访问后端接口, 在浏览器的安全策略下默认是不携带cookie的, 所以每次请求都开启了一次新的会话. 在后台打印sessionID我们会发现, 每次请求的sessionID都是不同的, ...
- 跨域问题session不一致问题的解决(前端和后台在不同的服务器)
场景:首先调用发送短信接口,然后调用注册接口,结果后台的session不一致获取不到之前验证码. 实质:每次ajax跨域访问都是新的session ,每次的sessionID都不一样 解决: pack ...
- web跨域访问,session丢失的问题
web跨域访问,session丢失的问题25 http://www.iteye.com/problems/71265 http://www.iteye.com/topic/264079 具体情况如下: ...
- CP="CAO PSA OUR" 用P3P header解决iframe跨域访问cookie
1.IE浏览器iframe跨域丢失Session问题 在开发中,我们经常会遇到使用Frame来工作,而且有时是为了跟其他网站集成,应用到多域的情况下,而Iframe是不能保存Session的因此,网上 ...
- jsonp突破同源策略,实现跨域访问请求
跨域访问问题,相信大家都有遇到过.这是一个很棘手的问题.不过道高一尺,魔高一丈,对于这类问题,总有解决问题的方案.最近我又接触到了这个问题,解决的途径是ajax+jsonp. 说到这个问题,不得不说一 ...
- js iframe跨域访问
1.什么是跨域? 2.前台解决跨域几种方法 2.1 动态创建script 2.2 使用document.domain 2.3使用HTML5新属性postMessage 2.4 利用iframe和loc ...
- springboot 前后端分离开发解决跨域访问
最近新学习了Java EE开发框架springboot,我在使用springboot前后台分离开发的过程中遇到了跨域求问题.在网上寻找答案的过程中发现网上的解决方案大多比较零散,我在这里整理一个解决方 ...
- ajax跨域访问http服务--jsonp
在前面一篇文章<Spring Cloud 前后端分离后引起的跨域访问解决方案>里我们提到使用ajax跨域请求其他应用的http服务,使用的是后台增加注解@CrossOrigin或者增加Co ...
随机推荐
- hihocoder1079 离散化
思路:线段树 + 离散化. 测试用例: 3 10 1 10 1 3 6 10 实现: #include <bits/stdc++.h> using namespace std; typed ...
- 批量部署Hadoop集群环境(1)
批量部署Hadoop集群环境(1) 1. 项目简介: 前言:云火的一塌糊涂,加上自大二就跟随一位教授做大数据项目,所以很早就产生了兴趣,随着知识的积累,虚拟机已经不能满足了,这次在服务器上以生产环境来 ...
- 纯手写的css3正方体旋转效果
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- # Transition:添加弹出过渡效果
# Transition:添加弹出过渡效果 通过鼠标的单击.获得焦点,被点击或对元素任何改变中触发,并平滑地以动画效果改变CSS的属性值. W3C-transition MDN-transition ...
- spring使用elasticsearchrepository时间格式的问题Invalid format: "XXXX-XX-XX" is malformed at "-XX-XX"
Invalid format: "XXXX-XX-XX" is malformed at "-XX-XX" 新手,刚接触elasticsearch遇到的问题. ...
- 原生JS--各种兼容性写法总结
<script> var oEvent = evt || event; ========================================================== ...
- dircolors - 设置‘ls'显示结果的颜色
SYNOPSIS[总览] dircolors [-b] [--sh] [--bourne-shell] [-c] [--csh] [--c-shell] [-p] [--print-database] ...
- 两个div之间的蜜汁间隙
两个div左右相邻,想让他们紧挨在一起 加了margin:0:padding:0: 不知道为什么还是会有间隙. 然后在两个div的父元素加了:font-size:0: 就终于挨在一起惹.
- ubuntu命令行转换图片像素大小
convert -resize 512x256 00433.png 00001.png 1.512和256之间是x(就是字母那个x),用' * '反而会报错 2.这个命令会按照原图的比例进行转换 3. ...
- Linux-01 虚拟机Linux的安装
学习要点 虚拟机VMware Workstation 11.0 CentOS6.5的安装 Linux简介 Linux 一种免费开源的操作系统 常作为服务器的操作系统使用 基本思想:一切都是文件 常用发 ...