JAVA web项目跨域

CORS跨域请求控制方法

1.http请求头

Origin: 普通的HTTP请求也会带有,在CORS中专门作为Origin信息供后端比对,表明来源域。

Access-Control-Request-Method: 接下来请求的方法,例如PUT, DELETE等等

Access-Control-Request-Headers: 自定义的头部,所有用setRequestHeader方法设置的头部都将会以逗号隔开的形式包含在这个头中

2.http响应头

然后浏览器再根据服务器的返回值判断是否发送非简单请求。简单请求前面讲过是直接发送,只是多加一个origin字段表明跨域请求的来源。然后服务器处理完请求之后,会再返回结果中加上如下控制字段

Access-Control-Allow-Origin: 允许跨域访问的域,可以是一个域的列表,也可以是通配符"*"。这里要注意Origin规则只对域名有效,并不会对子目录有效。即http://foo.example/subdir/ 是无效的。但是不同子域名需要分开设置,这里的规则可以参照同源策略

Access-Control-Allow-Credentials: 是否允许请求带有验证信息,

Access-Control-Expose-Headers: 允许脚本访问的返回头,请求成功后,脚本可以在

Access-Control-Max-Age: 缓存此次请求的秒数。在这个时间范围内,所有同类型的请求都将不再发送预检请求而是直接使用此次返回的头作为判断依据,非常有用,大幅优化请求次数

Access-Control-Allow-Methods: 允许使用的请求方法,以逗号隔开

Access-Control-Allow-Headers: 允许自定义的头部,以逗号隔开,大小写不敏感

如果程序猿偷懒将Access-Control-Allow-Origin设置为:Access-Control-Allow-Origin: * 允许任何来自任意域的跨域请求,那么久存在被 DDoS攻击的可能。

实现方式:

1、nginx配置文件配置:

server {

location / {

if ($request_method = ‘OPTIONS‘) {

add_header ‘Access-Control-Allow-Origin‘ ‘*‘;

add_header ‘Access-Control-Allow-Credentials‘ ‘true‘;

add_header ‘Access-Control-Allow-Methods‘ ‘GET, POST, OPTIONS‘;

add_header ‘Access-Control-Allow-Headers‘ ‘DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type‘;

# add_header ‘Access-Control-Max-Age‘ 3600;

add_header ‘Content-Type‘ ‘text/plain charset=UTF-8‘;

add_header ‘Content-Length‘ 0;

return 200;

}

}

方法2:直接在tomcat安装目录下的lib中添加cors-filter-1.7.jar,java-property-utils-1.9.jar 这2个jar包,并且在业务项目的web.xml 中配置想要应的filter配置文件:

<filter>

      <filter-name>CORS</filter-name>
      <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
      <init-param>
      <param-name>cors.allowOrigin</param-name>
      <param-value>*</param-value>
      </init-param>
      <init-param>
      <param-name>cors.supportedMethods</param-name>
      <param-value>GET,POST,HEAD,PUT,DELETE</param-value>
      </init-param>
      <init-param>
      <param-name>cors.supportedHeaders</param-name>
      <param-value>Accept,Origin,X-Requested-With,Content-Type,Last-Modified</param-value>
      </init-param>
      <init-param>
      <param-name>cors.exposedHeaders</param-name>
      <param-value>Set-Cookie</param-value>
      </init-param>
      <init-param>
      <param-name>cors.supportsCredentials</param-name>
      <param-value>true</param-value>
      </init-param>
      </filter>
      <filter-mapping>
      <filter-name>CORS</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>

方法3:自己写的  filter类,自己在在业务项目中配置web.xml 中配置想要的xml 文件。

如:java类filter:

public class CorsFilter implements Filter{

@Override

public void init(FilterConfig filterConfig) throws ServletException {

// TODO Auto-generated method stub

}

@Override

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,

ServletException {

// TODO Auto-generated method stub

HttpServletResponse res = (HttpServletResponse) response;

res.setContentType("text/html;charset=UTF-8");

res.setHeader("Access-Control-Allow-Origin", "*");

res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");

res.setHeader("Access-Control-Max-Age", "0");

res.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");

res.setHeader("Access-Control-Allow-Credentials", "true");

res.setHeader("XDomainRequestAllowed","1");

chain.doFilter(request, response);

}

@Override

public void destroy() {

// TODO Auto-generated method stub

}

}

业务项目中的web.xml配置如下:

<filter>

<filter-name>cors</filter-name>

<filter-class>com.tianlong.common.base.CorsFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>cors</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

PS:如果以上还无法实现跨域请求,那请检查防火墙是否允许请求通过!

时间: 2024-11-10 02:54:40

JAVA web项目跨域的相关文章

java web开发跨域问题

分布式环境,前后端分离背景下跨域问题 1.1 设置页面document.domain去把2个页面之间的跨域交互统一 一级域名相同的情况下 调用者和页面提供者进行一个协调 页面提供者要在document.domain=gopao.com 一般同一个公司的 1.2 HTML标签中有src属性的标签,支持且支持get请求,所以是允许跨域的,例如: image,a,多媒体标签 1.3 原文地址:https://www.cnblogs.com/james0/p/9282165.html

java-web项目跨域的问题

当web项目跨域访问时,给response添加一个Access-Control-Allow-Origin:*的头即可接口,添加方式: response.setHeader("Access-Control-Allow-Origin", "*");

java web项目答辩答辩题总结

答辩每个人的总分为1.5分.每个人主要问3个问题. 开发流程===>系统架构====>项目模块+功能===>项目得失重定向与转发:?九个隐式对象?get与post的区辨:?jsp有静态包含,动态包含,两者的区辨:?什么是MVC:?web系统架构:? java web项目答辩 1 http协议全名和特点 ------------------------------------------------------ HTTP是一种超文本传输协议(HyperText Transfer Proto

跨域调用webapi web端跨域调用webapi

https://www.baidu.com/s?ie=UTF-8&wd=webapi%20%E8%B7%A8%E5%9F%9F web端跨域调用webapi 在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案. 通过自己的研究以及在网上看了一些大神的博客,写了一个Demo 首先新建一个webapi的程序,如下图所示: 由于微软已经给我们搭建好了webapi的环境,所以我们不必去添加引用一些dll,直接开始写代码吧. 因为这只是做一个简单的Demo,并没有连接数据库.

大型Java Web项目的架构和部署问题

一位ID是jackson1225的网友在javaeye询问了一个大型Web系统的架构和部署选型问题,希望能提高现有的基于Java的Web应用的服务能力.由于架构模式和部署调优一直是Java社区的热门话题,这个问题引发了很多热心网友的讨论,其中一些意见对其它大型Web项目也有很好的指导意义.在讨论之初jackson1225这样描述了当前的应用的架构和部署方案: 目前系统架构如下: web层采用struts+tomcat实现,整个系统采用20多台web服务器,其负载均衡采用硬件F5来实现; 中间层采

熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。

熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验. 1.说一说Servlet生命周期(非常重要) Servlet生命周期包括三部分: 初始化:Web容器加载servlet,调用init()方法 只执行一次 处理请求:当请求到达时,运行其service()方法.service()自动调用与请求相对应的doXXX

No &#39;Access-Control-Allow-Origin&#39; header is present on the requested resource——Web Api跨域问题

最近使用C#写了一个简单的web api项目,在使用项目中的.cshtml文档测试的时候没有任何问题,但是在外部HBuilder上面编写.html通过Ajax调用web api路径时报错: No 'Access-Control-Allow-Origin' header is present on the requested resource. 导致这个问题的原因是在跨域访问web api的api时,C#自带的web api并不能支持跨域访问,如果需要,可以更改配置来实现. 1.更改Web.con

在java web项目中集成webservice

公司要求在项目中加入webservice服务,因为项目中使用了spring框架,所以在这里使用与spring兼容性较好的cxf来实现 cxf所需jar包 spring的jar包就不贴了 一:创建webservice服务器 1)创建一个服务接口 package com.service; import javax.jws.WebParam; import javax.jws.WebService; @WebService public interface IHelloWorld { public S

Java Web项目中缺少Java EE 6 Libraries怎么添加

具体步骤如下: 1.项目名称上点击鼠标右键,选择"Build Path-->Configure Build Path-->Java Build Path" 2.单击"Add Library..." 3.选择"User Library",单击"Next" 4.单击"User Libraries...",选择需要的Java EE 6 Libraries Java Web项目中缺少Java EE 6