Spring响应ajax: 403错误

Spring response ajax: 403 error

本文关键字:错误 ajax 响应 Spring      更新时间:2023-09-26

我使用Spring java-config AbstractAnnotationConfigDispatcherServletInitializer而不是web.xml和我的Spring控制器代码:

@RequestMapping(value = "/demo1", method = RequestMethod.POST)
public @ResponseBody
String demo1(HttpServletRequest request, HttpServletResponse response) {

    String poreqid = request.getParameter("poid");
    String refid = request.getParameter("refid");
    String status = request.getParameter("key");
    String key = poreqid+ refid+ status;
    return key;
    }
}

当我发送post从jquery-ajax到spring控制器,jquery显示错误。jquery控制台:

XMLHttpRequest无法加载http://192.168.1.206:8082/project1/demo1。请求的资源上没有'Access-Control-Allow-Origin'标头。因此,不允许访问原点'null'。响应的HTTP状态码为403。

我添加了

 @ComponentScan
 public class CorsFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
                                throws ServletException, IOException {
    response.addHeader("Access-Control-Allow-Origin", "*");
    if (request.getHeader("Access-Control-Request-Method") != null &&  "OPTIONS".equals(request.getMethod())) {
        // CORS "pre-flight" request
        response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
  //            response.addHeader("Access-Control-Allow-Headers", "Content-Type");
  //            response.addHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers"));
        response.addHeader("Access-Control-Allow-Headers", "X-Requested-With,Content-Type");
        response.addHeader("Access-Control-Max-Age", "1");// 30 min
    }
    filterChain.doFilter(request, response);
  }
}

我没有改变其余的代码,请提供我解决方案

您的域名localhost192.168.1.206被认为是不同的来源,如果没有额外的设置,您不能从不同的来源发送ajax请求。

要在Spring MVC中启用跨源请求,你应该添加一个过滤器,通过在响应中应用适当的头来显式地允许请求的起源,这是这样的过滤器的一个例子

@Component
public class SimpleCORSFilter 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");
        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) {}
    public void destroy() {}
}

和更多关于这个主题的阅读,你可以在这里找到

您可以删除@Component并以更传统的方式使用过滤器,通过在web.xml中声明它

<filter>
    <filter-name>cors</filter-name>
    <filter-class>your.package.CorsFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>cors</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>