在一个项目开发中遇到项目中ajax提交跨域的问题,此前也遇到过此类问题,但由于技术储备不够,以及时间问题。只能更换其他方法实现业务。这一次终于攻克。
ajax 跨域报错:
我的登录界面与验证功能是在服务器中的项目提供的。要提交表单到本地项目,就出现了跨域的错误,
找了很多方法。
第一种。创建CorsConfig工具类。
代码如下:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@Configuration
public class CorsConfig {
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*"); // 1允许任何域名使用
corsConfiguration.addAllowedHeader("*"); // 2允许任何头
corsConfiguration.addAllowedMethod("*"); // 3允许任何方法(post、get等)
return corsConfiguration;
}
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
// 配置所有请求
source.registerCorsConfiguration("/**", buildConfig());
return new CorsFilter(source);
}
}
此方法确实可以解决ajax提交跨域的问题。在验证成功后,也确实产生了登录对象,并存到了session中。但是在返回到页面由本地项目请求时,获取的session为null值。
第二种、解决跨域并且session可共用。(推荐)
只要加上:@CrossOrigin(allowCredentials="true",allowedHeaders="*") 这个注解即可实现方法中产生的session可共存,并且跨域请求也可以接收
代码如下:
@RequestMapping("/login/loginFn")
@CrossOrigin(allowCredentials="true",allowedHeaders="*")
@ResponseBody
public Map<String, Boolean> loginFn(String loginCode,String password,HttpSession session){
}
注意:这个注解跟上面的CorsConfig 类不可共存。加注解时,上面的工具类语言删除。不然两种都不能生效
前端无需特别的设置。网上说ajax要加上 xhrFields:{ withCredentials:true } 才能实现。可我的没有这个也一样可以成功。
至此跨域问题成功解决。session可共用