在开发过程中遇到这么一个问题,让我花了一个下午的大好时光才解决。但是解决玩之后,发现那么的容易。就是查找资料的时候很费劲。这里把问题记录一下。

问题的产生

  • 流程是这样的,要做一个用户登录的接口。在登录页面,前端先请求验证码,然后输入用户名密码和验证码之后,请求登录接口。
  • 这里存在两个接口,验证码接口和登录接口。在验证码接口中我用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)
  1. 在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不一致问题的更多相关文章

  1. 解决ajax跨域访问sessionid不一致问题

    根据浏览器的保护规则,跨域的时候我们创建的sessionId是不会被浏览器保存下来的,这样,当我们在进行跨域访问的时候,我们的sessionId就不会被保存下来,也就是说,每一次的请求,服务器就会以为 ...

  2. 解决vue+springboot前后端分离项目,前端跨域访问sessionID不一致导致的session为null问题

    问题: 前端跨域访问后端接口, 在浏览器的安全策略下默认是不携带cookie的, 所以每次请求都开启了一次新的会话. 在后台打印sessionID我们会发现, 每次请求的sessionID都是不同的, ...

  3. 跨域问题session不一致问题的解决(前端和后台在不同的服务器)

    场景:首先调用发送短信接口,然后调用注册接口,结果后台的session不一致获取不到之前验证码. 实质:每次ajax跨域访问都是新的session ,每次的sessionID都不一样 解决: pack ...

  4. web跨域访问,session丢失的问题

    web跨域访问,session丢失的问题25 http://www.iteye.com/problems/71265 http://www.iteye.com/topic/264079 具体情况如下: ...

  5. CP="CAO PSA OUR" 用P3P header解决iframe跨域访问cookie

    1.IE浏览器iframe跨域丢失Session问题 在开发中,我们经常会遇到使用Frame来工作,而且有时是为了跟其他网站集成,应用到多域的情况下,而Iframe是不能保存Session的因此,网上 ...

  6. jsonp突破同源策略,实现跨域访问请求

    跨域访问问题,相信大家都有遇到过.这是一个很棘手的问题.不过道高一尺,魔高一丈,对于这类问题,总有解决问题的方案.最近我又接触到了这个问题,解决的途径是ajax+jsonp. 说到这个问题,不得不说一 ...

  7. js iframe跨域访问

    1.什么是跨域? 2.前台解决跨域几种方法 2.1 动态创建script 2.2 使用document.domain 2.3使用HTML5新属性postMessage 2.4 利用iframe和loc ...

  8. springboot 前后端分离开发解决跨域访问

    最近新学习了Java EE开发框架springboot,我在使用springboot前后台分离开发的过程中遇到了跨域求问题.在网上寻找答案的过程中发现网上的解决方案大多比较零散,我在这里整理一个解决方 ...

  9. ajax跨域访问http服务--jsonp

    在前面一篇文章<Spring Cloud 前后端分离后引起的跨域访问解决方案>里我们提到使用ajax跨域请求其他应用的http服务,使用的是后台增加注解@CrossOrigin或者增加Co ...

随机推荐

  1. idea DeBug调试学习

    在Intellij IDEA中使用Debug 目录 一.Debug开篇 二.基本用法&快捷键 三.变量查看 四.计算表达式 五.智能步入 六.断点条件设置 七.多线程调试 八.回退断点 九.中 ...

  2. Java开发笔记(九十四)文件通道的性能优势

    前面介绍了字节缓存的一堆概念,可能有的朋友还来不及消化,虽然文件通道的用法比起传统I/O有所简化,可是平白多了个操控繁琐的字节缓存,分明比较传统I/O更加复杂了.尽管字节缓存享有缓存方面的性能优势,但 ...

  3. 为Qt添加SSL支持

    目标:为Qt添加SSL支持,使得应用可以发送HTTPS请求 环境:win7,Qt4.8.6 步骤: 1.到http://slproweb.com/products/Win32OpenSSL.html下 ...

  4. CATransaction 知识

    CATransaction 事务类,可以对多个layer的属性同时进行修改.它分隐式事务,和显式事务. 区分隐式动画和隐式事务:隐式动画通过隐式事务实现动画 . 区分显式动画和显式事务:显式动画有多种 ...

  5. 如何修改开发板主频--迅为iMX6UL开发板

    平台:iMX6UL开发板           iMX6UL开发板 可以在文件系统中通过命令修改 CPU 运行的主频.如下图所示,使用命令“cat /sys/devices/system/cpu/cpu ...

  6. (转)让Spring自动扫描和管理Bean

    http://blog.csdn.net/yerenyuan_pku/article/details/52861403 前面的例子我们都是使用XML的bean定义来配置组件.在一个稍大的项目中,通常会 ...

  7. mysql利用binlog恢复数据

    需求:需要给开发提供一个2018年9月30号的数据,按照我们公司正常备份策略来说,直接找到对应时间的备份数据,解压导入即可,恰好这个时间节点的数据没有,只备份到2018年9月25号的,糟糕了吧 咋办呢 ...

  8. Linux-RedHat7.2 安装nginx托管.net core2.0

    1.安装依赖包 yum -y install gcc gcc-c++ pcre pcre-devel openssl openssl-devel zlib zlib-devel 2.下载安装包 wge ...

  9. b继承a的函数

    var cls={ my:, init:function() { alert(this.my.a); }};window.onload=function(){ cls.init();} 调用cls.i ...

  10. HashMap和HashTable的理解与区别

    Hashtable是java一开始发布时就提供的键值映射的数据结构,而HashMap产生于JDK1.2.虽然Hashtable比HashMap出现的早一些,但是现在Hashtable基本上已经被弃用了 ...