使用Ajax通过post向后端发送数据时,出现越界错误, from origin 'null' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.已经在Java代码中添加CORS(跨域资源共享)拦截器但是没有用,通过配置web.xml的过滤器我也写了但是没用。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>发送Ajax请求</title>
<script src="./js/jquery-3.4.1.min.js"></script>
</head>
<body>
<form>
<label for="username">用户: </label>
<input type="text" id="username" name="username"><br>
<label for="password">密码: </label>
<input type="password" id="password" name="password">
<br>
<input type="button" id="submit" value="提交">
</form>
<script>
$("#submit").click(function(){
// 获取输入的用户名和密码
var username = $("#username").val();
var password = $("#password").val();
// 对用户名和密码进行验证和过滤
if(username.length === 0 || password.length === 0){
// 用户名或密码为空,进行相应处理
return;
}
var requestData = {
username: username,
password: password
};
// 发送Ajax请求
$.ajax({
url:"http://localhost:80/user/web",
type:'post',
data: requestData,
dataType: 'json',
contentType:'application/json',
success: function(res){
// 请求成功的处理
window.alert("成功",res);
},
error: function(xhr){
window.alert("错误",xhr);
},
complete: function(xhr){
console.log('完成',xhr);
}
});
});
</script>
</body>
</html>
```java
//Controller类
@RestController
@RequestMapping("/user")
//@CrossOrigin(origins = "*", allowedHeaders = "*", methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE})
public class UserController {
@PostMapping("/web")
public String WebSave(@RequestBody WebUser webUser){
System.out.println("name: "+webUser.getUsername()+"\npassword: "+webUser.getPassword());
return "test.html";
}
@PostMapping("/web1")
public String WebSave1(String name,String password){
System.out.println("name: "+name+"\npassword: "+password);
return "1234";
}
}
//自己定义用来接收数据的web user类
public class WebUser {
private String username;
private String password;
}
//Config类
//1.配置类
//@Import(WebMvcConfig.class)
public class ServletInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
@Configuration
@ComponentScan({"com.demo.Class","com.demo.dao"})
public class SpringConfig {
}
@Configuration
@ComponentScan("com.demo.Controller")
@EnableWebMvc
public class SpringMvcConfig {
}
2.拦截器的配置文件
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CorsInterceptor());
}
}
//拦截器
public class CorsInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
response.setHeader("Access-Control-Allow-Origin", "*");//允许所有来源访同
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");//允许访问的方式
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
return true;
}
}
//过滤器
public class CorsFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
chain.doFilter(req, res);
}
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化方法
}
public void destroy() {
// 销毁方法
}
public boolean isLoggable(LogRecord record) {
return false;
}
// 其他方法
}
//web.xml
<web-app>
<display-name>Archetype Created Web Application</display-name>
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>com.demo.Class.CorsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
我全部代码都粘上了,刚开始学这个,弄了一天一点头绪都没有,最开始其他的那些405,403之类的报错我能改都带掉了,我想要达到的效果就是能够通过Ajax代码实现前端向后端传输json格式的数据封装到对应类里面,然后在后端控制台打印出来。
我在说一下,我这里用的jdk8,tomcat7(maven自带的那个),是springmvc框架,前端就是纯html和js(就能输入数据,并提交给后端就可以了)
CORS 是跨域错误,配个跨域的中间件或者配置就行了
你这是跨域请求了,我之前uni-app开发字节小程序也遇到过,具体搞法忘记了
不知道你这个问题是否已经解决, 如果还没有解决的话:CORS 跨域资源共享,即Cross-Origin Resource Sharing
。它新增的一组 HTTP 首部字段允许服务器其声明那些来源请求有权访问哪些资源,就是它允许浏览器向其声明了 CORS 的栈进行跨域请求。
这种方式最主要的特点就是会在响应的 HTTP 首部增加 Access-Control-Allow-Origin
等信息,从而判定那些资源站可以进行跨域请求,还有几个其他相关的 HTTP 首部进行更加精细化的控制,最主要的还是Access-Control-Allow-Origin
。
CORS 与 JSONP 对比来说又是比较明显,JSONP 只支持 GET 方式,而且 JSONP 并不符合处理业务的正常流程。采用 CORS 的方式,前端编码与正常非跨域请求没有什么不同。
在真正的发送跨域请求之前会发送一个试探性请求(OPTIONS),服务器接收到 OPTIONS请求之后,做一个处理,返回成功,表示可以发送跨域请求,再发送真正的跨域请求
服务端设置相关的头信息(需要处理试探性请求OPTIONS)
可以利用nginx反向代理来解决跨域问题。
ip:端口号换成域名试试
dataType: 'jsonp',试一下看能绕过不
在后台的请求接口中放开跨域一般就可以解决。
别听他们说,你本地的没有跨域,即使报了这种错误,也别去想着配置跨域(没用的、浪费时间),原因主要就是哪里一个细节搞错了,ajax这个地址:url:"http://localhost:80/user/web",如果的页面跟后端在同一个项目,可以改成相对路径试试
前后端分离,jquery使用post请求出现跨越以及相关错误
可以参考下,现成的
我最近碰到过
你服务端在options 请求头中 返回allow header 什么的那个请求头 为星号 就可以请求成功了
这不是跨域的 是预请求失败 你搜搜看预请求失败
前端是否有单独的端口?跟后端端口是否一致,端口一致的话不会有跨域问题,端口不一致,最简单有效的方式是下载一个nginx,进行代理,把前端请求通过nginx转发给后端,这样就不会遇到这样的错误,另外,后台是可以配置跨域的,但是这个配置是要看情况的,如果添加了权限组件,则跨域配置会很麻烦,java配置跨域,csdn上可以搜到很多答案,需要一个一个的尝试
涉及到Ajax通过post向后端发送数据时出现越界错误,需要仔细分析错误的原因和可能的解决办法。本文将详细讲解该问题的可能原因以及解决办法,希望能够对大家有所帮助。
一、Ajax请求的流程
首先,我们需要了解一下Ajax请求的流程。Ajax(Asynchronous JavaScript and XML,异步的 JavaScript 和 XML)是一种用于创建快速动态网页的技术。本质上,Ajax 是一种无需重新加载整个网页的情况下,能够更新部分网页的技术。Ajax请求的基本流程如下:
二、什么是“越界错误”
在进行Ajax请求时,有时会遇到“越界错误”的问题。所谓“越界错误”是指当数组的下标超出了数组的范围时,就会发生越界错误。例如,数组长度为5,却试图访问第6个元素,就会导致越界错误。
在Ajax请求中,越界错误通常是指向后端发送数据时出现的问题。即:在使用post方式向后端发送数据时,出现了越界错误。
三、可能的原因
出现越界错误的原因可能有很多种。下面列举几种比较常见的情况:
在向后端发送数据时,如果数据格式不正确,例如没有按照后端要求的格式进行编写,就会导致越界错误的问题。此时,我们需要检查一下数据格式是否正确,并且确认数据是否有缺失或者多余的部分。
向后端发送数据时,如果数据长度过长,就有可能导致越界错误。这种情况下,我们需要检查一下数据的长度,并且确认后端是否可以接收这么长的数据。
有时候,越界错误可能是由于后端接收数据的方式不正确导致的。例如,后端要求使用表单形式提交数据,但是我们使用的是Ajax方式提交数据,就可能导致越界错误的问题。此时,我们需要确认一下后端要求使用何种方式接收数据,并且对应修改我们的代码。
除了上述几种情况外,越界错误还可能由于其他原因导致。例如,网络问题、服务器端问题等等。此时,需要认真排查错误,并且根据实际情况进行处理。
四、解决办法
针对不同的原因,我们可以采取不同的解决办法。下面列举几种常见的解决方法:
如果出现越界错误,我们首先要检查一下数据格式是否正确。如果数据格式不正确,就需要对数据进行调整,并且确认数据是否有缺失或者多余的部分。
如果数据长度过长,就需要考虑对数据进行压缩或者分批发送。例如,可以使用gzip对数据进行压缩,减少数据的大小。或者可以将数据分成多个部分,分别发送到后端,避免数据长度过长。
如果出现越界错误,我们还需要确认一下后端接收数据的方式是否正确。如果后端要求使用表单形式提交数据,我们就需要使用表单提交数据,并且确认表单元素的名称是否正确。如果使用Ajax方式提交数据,就需要确认后端是否可以接收这种方式发送的数据。
在进行Ajax请求时,可能会遇到网络问题或者服务器端问题,这些问题都有可能导致越界错误的问题。为了解决这些问题,我们可以加入容错处理。例如,可以加入超时处理、重试机制等等,提高请求的稳定性和可靠性。
五、总结
在使用Ajax向后端发送数据时,出现越界错误是一种比较常见的问题。出现这种问题时,我们需要仔细分析错误的原因,并且根据实际情况采取相应的解决办法。在编写Ajax请求的代码时,我们需要注意数据格式、数据长度、后端接收方式等一些细节问题,以避免出现越界错误等常见问题,提高代码的质量和稳定性。
首先调试过滤器代码,确保下面这段代码正确配置
response.setHeader("Access-Control-Allow-Origin", "*");
一般来说后端配置CORS之后,前端就不需要再次配置
目前我觉得主要问题还是后端你配置了跨域,但是未配置生效
出现跨域资源共享(CORS)错误通常是由于服务器未设置适当的的数据访问控制导致的。在你的情况下,出现错误的原因可能是由于请求的URL与请求的origin不同,因此被服务器阻止了。你可以在后端服务的器的响应头中添加 Access-Control-Allow-Origin,将其设置为容许的来源URL。
存在跨域
CORS跨域配置少了东西
这个错误是由于浏览器的同源策略导致的跨域请求问题。为了解决这个问题,你需要在后端服务器上配置CORS(跨域资源共享)头来允许跨域请求。
在Java中,你可以使用Filter或Interceptor来配置CORS头。如果你已经在代码中添加了CORS拦截器但没有生效,可能是由于配置不正确或者没有正确应用该拦截器。
首先,确保你在CORS拦截器中正确设置了允许跨域请求的头信息。以下是一个示例的CORS拦截器配置代码:
确保该拦截器类上添加了@Component
注解,并且被正确扫描到。
另外,确保在你的配置文件中启用了拦截器,例如使用@EnableWebMvc
注解来开启Spring MVC的配置:
如果你已经正确配置了CORS拦截器,但仍然出现错误,可能是由于其他浏览器安全策略所致。你可以尝试在后端服务器中配置CORS过滤器,如下所示:
<web-app>
标签内添加以下CORS过滤器配置:确保你的过滤器类被正确配置和识别。重新启动你的应用程序并尝试发送跨域请求。
如果以上方法无效,还可以尝试使用其他浏览器插件或工具来解决CORS问题,如谷歌浏览器的"CORS Unblock"插件或通过代理服务器发送请求等。
在使用Ajax进行POST请求时,出现越界错误可能是由于多种原因导致的。以下是可能导致此问题的几种情况及解决方法:
在使用Ajax来发送POST请求时,需要设置请求头来指定请求的方式以及要发送数据的格式。如果未正确设置请求头,则会提示错误。
解决方法:在发送POST请求前,确保已正确设置请求头。例如:
var request = new XMLHttpRequest();
request.open("POST", "http://www.example.com/api", true);
request.setRequestHeader("Content-Type", "application/json");
request.send(data);
如果发送POST请求时,要发送的数据量超过了服务器的限制,则会提示错误。
解决方法:检查要发送的数据量是否超过了服务器的限制。可以通过减少数据量、压缩数据等方式来解决。
如果发送的数据格式不正确,例如要求发送的是JSON格式的数据,但是发送的数据却不是JSON格式,则会提示错误。
解决方法:检查要发送的数据是否符合要求,例如是否是正确的JSON格式。
如果发送的数据长度与服务器要求的长度不一致,则会提示错误。
解决方法:检查要发送的数据长度是否符合服务器要求。
在使用Ajax发送POST请求时,还可能会出现其他的错误,例如服务器端程序的bug、网络连接不稳定等原因,这些都可能导致请求失败或报错。
解决方法:排查具体原因,可以通过查看服务器端日志、网络连接状态等方式来排查问题。
总之,在使用Ajax发送POST请求时,需要仔细检查请求的各项参数,并且对各种可能出现的问题进行充分的预判和处理,才能确保请求的成功。
参考newbing
出现CORS错误通常是由于浏览器的同源策略引起的,它限制了在不同域之间进行跨域请求。为了解决这个问题,你需要在后端服务器配置中添加相应的CORS头信息。
在Java中,可以通过在响应中添加Access-Control-Allow-Origin
头来解决CORS问题。这个头指定了可以访问资源的域名。你可以将其设置为*
来允许任何域名访问资源,或者设置为特定的域名。
首先,确保你的后端服务器已经添加了CORS拦截器或过滤器,如下所示:
import org.springframework.web.filter.CorsFilter;
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}
上述代码中,我们创建了一个CorsConfig
类,并使用@Configuration
注解将其标记为配置类。然后,我们创建了一个CorsFilter
的Bean,并配置了CorsConfiguration
,允许所有域名访问资源。
如果你已经添加了CORS拦截器或过滤器,但问题仍然存在,那么可能是因为你的配置没有生效。你可以尝试以下方法来解决问题:
如果上述方法都没有解决问题,你可以尝试使用其他方式来处理CORS问题,例如在web.xml
中配置过滤器:
<filter>
<filter-name>CORSFilter</filter-name>
<filter-class>com.example.CORSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CORSFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
上述代码中,我们创建了一个名为CORSFilter
的过滤器,并将其映射到所有的URL模式。你需要将com.example.CORSFilter
替换为你实际的过滤器类。
请确保在使用任何配置时,仔细检查代码和配置是否正确,并确保服务器已经重新启动以使更改生效。