不太确定是不是跨越的问题:
问题描述:最近一个springboot项目,前端使用vue2。在没有部署服务器上,在本机上运行时,cookie值可以正常的读取。目前,把后端的项目放到服务器上,vue项目还是在本地上跑。配置好请求路径后。前端可以请求上服务器的后端,但是在登陆后,不论时前端的登录,还是后台管理员登录。在登陆后都不可以读取到cookie值。
代码 如下
login控制器
@RequestMapping("login")
@PreOperLog(message = "用户登录",operation = OperationType.LOGIN)
@OperLog(message = "用户登录",operation = OperationType.LOGIN)
public ResultVo login(@RequestParam("accountNumber") @NotEmpty @NotNull String accountNumber,
@RequestParam("userPassword") @NotEmpty @NotNull String userPassword,
HttpServletResponse response, HttpSession session) {
UserModel userModel = userService.userLogin(accountNumber, userPassword);
System.out.println("登录:" + userModel);
if (null == userModel) {
return ResultVo.fail(ErrorMsg.EMAIL_LOGIN_ERROR);
}
// 这里对账号的状态进行判断,是否封禁
// 0代表正常,1代表封号
if(userModel.getUserStatus()!=null&&userModel.getUserStatus().equals((byte) 1)){
return ResultVo.fail(ErrorMsg.ACCOUNT_Ban);
}
session.setAttribute("userNumber",accountNumber);
System.out.println("session里是否存入了值"+session.getAttribute("userNumber"));
// cookie就是一个小体积的键值对,格式:key=value;
// 这里是为shUserId设置Cookie值
Cookie cookie = new Cookie("shUserId", String.valueOf(userModel.getId()));
cookie.setMaxAge(60 * 60 * 24 * 30);
// 该方法设置 cookie 适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie。
cookie.setPath("/");
cookie.setHttpOnly(false);
System.out.println("cookie"+cookie);
System.out.println("cookie"+cookie);
System.out.println("cookie"+cookie);
System.out.println("cookie"+cookie);
// 将cookie加入http响应头 效果就是,添加后网址后面会跟上URL=.............后面省略号就是cookie值
// Cookie是存储在浏览器端而Session是存储在服务器端
// cookie.setMaxAge(60*1*1) ;
response.addCookie(cookie);
// response.addCookie(cookie)一旦执行,服务器端会自动发回消息头set-cookie给浏览器,
// set-cookie是会携带cookie键值对的,uname=kitty。创建的cookie就会保存在浏览器。所以创建的cookie是会保存在浏览器上的
return ResultVo.success(userModel);
}
跨域配置
package com.second.hand.trading.server;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.servlet.http.HttpServletResponse;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 允许跨域访问
*
* 解决前端的端口号和后端的端口号不一致的问题
*/
// CorsRegistry的全称为Cross-Origin Resource Sharing Registry ,
// 直译过来就是跨域资源共享登记。是spring中解决跨域的一种方式
@Override
public void addCorsMappings(CorsRegistry registry) {
//本应用的所有方法都会去处理跨域请求
String [] allowDomain={"http://8.130.27.251:8080","http://localhost:8081","www.ytuusedbook.top","http://b6emtg.natappfree.cc"};
// String [] allowDomain={"http://8.130.27.251/:8080","http://b6emtg.natappfree.cc"};
registry.addMapping("/**") // 可限制哪个请求可以通过跨域
.allowedHeaders("*") // 可限制固定请求头可以通过跨域
.allowedMethods("*") // 可限制固定methods可以通过跨域
.allowedOrigins("*")
.allowedOrigins(allowDomain) // 可限制访问ip可以通过跨域
// .allowedOrigins("http://b6emtg.natappfree.cc")
// .allowedOrigins("http://localhost:8082")
// .allowedOrigins("http://localhost:8080")
// 这里不允许多个端口,否则前端访问不到8081端口
.allowCredentials(true) // 是否允许发送cookie
.exposedHeaders(HttpHeaders.SET_COOKIE);
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogCostInterceptor()).addPathPatterns("/**");
}
}
vue配置
const webpack = require('webpack')
module.exports = {
publicPath: './',
assetsDir: 'static',
outputDir: 'dist',
productionSourceMap: false,
configureWebpack: {
plugins: [
new webpack.ProvidePlugin({
$: "jquery",
jQuery: "jquery",
"windows.jQuery": "jquery"
})
],
devServer: {
disableHostCheck: true,
}
},
devServer: {
// allowedHosts: [
// 'host.com', // 允许访问的域名地址,即花生壳内网穿透的地址
// '.host.com' // .是二级域名的通配符
// ],
port: 8080,
// disableHostCheck: true,
},
//https://blog.csdn.net/yuanlaijike/article/details/80522621
devServer: {
proxy: {
'/api':{
//后端接口的根目录
target:'http://8.130.27.251:8080',
target:' http://b6emtg.natappfree.cc',
changeOrigin:true,
pathRewrite:{
// '/api':'http://localhost:8080'
'^/api':'/'
}
}
}
}
};
在登陆后,正常情况下是用户的信息存储在cookie里面,在进行登录后的其他操作时,验证cookie值是否不为空,不为空进行其他的操作。
如登录后,查看用户的详细信息,服务器哪里提示cookie为空。。
如图:
这应该是什么问题呢??
你把你的前端代码也放在服务器上,同一个域名下么,应该就ok了。
该回答引用ChatGPT
registry.addMapping("/**")
.allowedOrigins("http://8.130.27.251:8080","http://localhost:8081")
.allowedMethods("*")
.allowedHeaders("*")
.allowCredentials(true);
response.addCookie(cookie);
引用chatGPT作答,该问题可能与Cookie的Domain属性有关。Cookie的Domain属性指定了哪些主机可以访问cookie。如果cookie的Domain属性设置为localhost,则cookie只能由与服务器运行在同一台机器上的应用程序访问。如果应用程序运行在另一台计算机上,则该应用程序将无法访问cookie。
建议将Cookie的Domain属性设置为服务器的IP地址或域名,以允许跨越不同主机之间的应用程序访问cookie。在您的代码中,您可以通过将Cookie的Domain属性设置为您的服务器IP地址来解决此问题:
cookie.setDomain("8.130.27.251");
如果您的应用程序可以通过多个域名或IP地址访问,则可以在Domain属性中指定逗号分隔的值:
cookie.setDomain("8.130.27.251,www.ytuusedbook.top");
还要注意,如果您使用了HTTPS,您需要将Secure属性设置为true,以确保cookie仅在加密的连接上发送。
cookie.setSecure(true);
最后,为了确保所有cookie属性都正确设置,请检查您的浏览器是否接收到并发送了正确的cookie。您可以在浏览器开发者工具的Network选项卡中查看请求和响应头。
以下内容部分参考ChatGPT模型:
可能存在跨域问题,因为前端是在本地运行,后端是部署在服务器上的,两者的域名不一样,需要进行跨域配置。但是提问者已经在代码中进行了跨域配置,因此还需要排除其他可能的问题。
首先,建议在浏览器的开发者工具中查看请求和响应的具体信息,看看是否有cookie被发送和接收。如果没有,那么可能是因为服务器端没有正确设置cookie,可以检查代码中设置cookie的部分是否正确。
另外,还需要注意cookie的域名和路径设置是否正确。如果cookie的域名和路径不正确,可能会导致前端无法读取到cookie,从而无法进行其他操作。可以在设置cookie的代码中加入如下设置:
cookie.setDomain("yourdomain.com"); // 设置cookie的域名
cookie.setPath("/"); // 设置cookie的路径,使其在整个网站都可以访问
最后,如果以上都没有解决问题,可以尝试使用其他的存储方式,比如使用localStorage或sessionStorage来存储用户信息。这样可以避免cookie的一些限制,但是需要注意安全性问题。例如,如果存储了用户的敏感信息,需要对数据进行加密处理。
如果我的建议对您有帮助、请点击采纳、祝您生活愉快
可能是前后端不在一个服务器上的原因造成的,解决方法一是将部署到一台服务器上查看,方法二是将缓存信息存到redis中,然后代码中从redis中获取即可
看看是不是这个问题:https://blog.csdn.net/we_shell/article/details/45153885
location /proxy_path {
proxy_pass http://127.0.0.1:8080/project;
proxy_cookie_path /project /proxy_path;
}
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
根据你的描述,问题不太可能是跨域问题。如果是跨域问题,前端应该能够正常请求后端,只是无法读取到 cookie 值。
由于你在本地可以正常读取 cookie 值,而在服务器上无法读取,可能是服务器上的一些配置问题。你需要通过打印日志来定位具体的问题,以下是一些可能的原因和排查方法:
服务器上的 cookie 路径不正确:你可以查看服务器响应头中的 Set-Cookie 字段,确定返回的 cookie 是否包含正确的路径。你在代码中设置了 cookie 的路径为 "/",表示该 cookie 可以在所有路径下访问,但如果服务器配置了路径限制,可能导致无法读取 cookie。
服务器上的 cookie 域名不正确:同理,你也可以查看响应头中的 Set-Cookie 字段,确保设置的域名和请求的域名一致。如果不一致,可能导致 cookie 不可读。
服务器上的 cookie HTTPOnly 设置为 true:HTTPOnly 标记是表示该 cookie 只能通过 HTTP(S) 协议传输,JavaScript 脚本无法读取该 cookie。如果服务器设置了该标记,前端就无法通过 JavaScript 读取 cookie。
服务器上的 cookie 过期时间设置不正确:你在代码中设置了 cookie 的过期时间为 30 天,但服务器可能会根据自己的设置重新设置 cookie 的过期时间。你可以通过查看响应头中的 Set-Cookie 字段来确定实际的过期时间是否正确。
其他问题:如果以上排查方法都无法解决问题,可能是其他问题造成的。你需要打印更多的日志,查看请求和响应的具体内容,以便更好地定位问题。
希望以上方法能够帮助你解决问题。如果仍然无法解决,可以提供更多的代码和日志,我会帮你分析。
如果我的回答解决了您的问题,请采纳!