Java服务器端如何实现跨越
2021-11-22 09:52 猎手家园 阅读(209) 评论(0) 编辑 收藏 举报我们开发H5项目,通过JS调用某个远程接口时经常会出现这跨域的问题,一般的解决办法就是在服务器增加对请求头的判断。
这里我们讲一下在java中通过filter过滤器如何实现;当然,你也可以在nginx中配置,或者使用jsonp实现。
1、假如我命名为:CorsFilter.java
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 { HttpServletResponse res = (HttpServletResponse) response; res.setContentType("application/json;charset=UTF-8"); res.setHeader("Access-Control-Allow-Origin", "*"); res.setHeader("Access-Control-Allow-Methods", "POST, GET"); res.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type"); res.setHeader("Access-Control-Max-Age", "604800"); chain.doFilter(request, response); /* 跨域配置说明 * Access-Control-Allow-Origin 设置允许跨域的白名单,在白名单里的跨域请求是允许的。 * Access-Control-Allow-Methods 设置接受的方法,这里只接受POST方法。 * Access-Control-Allow-Headers 设置接受的请求头,用逗号分隔。 * Access-Control-Allow-Max-Age 设置预检的有效期,单位为秒。发送正式请求前,浏览器会预先发送一个预检请求,如果服务器返回了上述信息,表明是可以跨越请求的,然后才会正式发送请求。预检成功后,在有效期内就不用再发送了。 * Access-Control-Allow-Credentials 设置是否允许客户端携带验证信息 */ } @Override public void destroy() { // TODO Auto-generated method stub } }
这里我们提一下:Access-Control-Allow-Origin 这个配置,他是表示允许的白名单,“ * ” 表示不限。
这是一种比较粗暴的设置,容易引起DDOS攻击,所以,最好还是进行指定域名,如:Access-Control-Allow-Origin: "http://www.domain.com/"
但是,如果有多个域名怎么办?这里需要做一下判断,动态赋一下值。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse res = (HttpServletResponse) response; String[] allowDomain = {"http://www.domain1.com", "http://www.domain2.com"}; Set<String> allowedOrigins = new HashSet<String>(Arrays.asList(allowDomain)); String originHeader = ((HttpServletRequest) request).getHeader("Origin"); if (allowedOrigins.contains(originHeader)) { res.setHeader("Access-Control-Allow-Origin", originHeader); res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); res.setHeader("Access-Control-Max-Age", "3600"); res.setHeader("Access-Control-Allow-Headers", "content-type, x-requested-with"); res.setHeader("Access-Control-Allow-Credentials", "true"); } chain.doFilter(request, response); }
2、在web.xml中配置如下
<!-- 跨域过滤器 --> <filter> <filter-name>cors</filter-name> <filter-class>com.domian.controller.filter.CorsFilter</filter-class> </filter> <filter-mapping> <filter-name>cors</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
欢迎关注我的公众号:云栖语,不一样的研发视界。

云栖语微信公众号:change-1978
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术