电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Java 跨域問題的處理方式

瀏覽:84日期:2022-08-20 18:47:18

問題

在頁面上要使用 Ajax 請求去獲取另外一個(gè)服務(wù)的數(shù)據(jù),由于瀏覽器的 同源策略,所以直接請求會得到一個(gè) Error。

Failed to load https://www.baidu.com/: No ’Access-Control-Allow-Origin’ header is present on the requested resource. Origin ’http://localhost:3000’ is therefore not allowed access. If an opaque response serves your needs, set the request’s mode to ’no-cors’ to fetch the resource with CORS disabled.

大概就是這樣的一個(gè)錯(cuò)誤,關(guān)鍵詞是 Access-Control-Allow-Origin,一般出現(xiàn)這個(gè)都是跨域問題。

解決方案

解決跨域問題的方式有很多,但這里之說 Cors 的方案。

在后臺添加一個(gè) Filter 過濾器

/** * 使用自定義的 Filter 攔截器實(shí)現(xiàn)跨域請求、 * 適用于所有的 Java Web 項(xiàng)目并且不局限于某個(gè)框架 * 注:此處的 @Component 僅為讓 Spring 知道這個(gè) Bean, 不然攔截器不會加載 * * @author rxliuli */public class CustomCorsFilterConfig implements Filter { @Override public void init(FilterConfig filterConfig) { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //允許所有來源 String allowOrigin = '*'; //允許以下請求方法 String allowMethods = 'GET,POST,PUT,DELETE,OPTIONS'; //允許以下請求頭 String allowHeaders = 'Content-Type,X-Token,Authorization'; //允許有認(rèn)證信息(cookie) String allowCredentials = 'true'; String origin = request.getHeader('Origin'); //此處是為了兼容需要認(rèn)證信息(cookie)的時(shí)候不能設(shè)置為 * 的問題 response.setHeader('Access-Control-Allow-Origin', origin == null ? allowOrigin : origin); response.setHeader('Access-Control-Allow-Methods', allowMethods); response.setHeader('Access-Control-Allow-Credentials', allowCredentials); response.setHeader('Access-Control-Allow-Headers', allowHeaders); //處理 OPTIONS 的請求 if ('OPTIONS'.equals(request.getMethod())) { response.setStatus(HttpServletResponse.SC_OK); return; } filterChain.doFilter(request, response); } @Override public void destroy() { }}

在 web.xml 文件中添加攔截器配置(注:如果可能就配置成第一個(gè) Filter)

<!--cors 跨域訪問--><filter> <filter-name>customCorsFilterConfig</filter-name> <filter-class>CustomCorsFilterConfig</filter-class></filter><filter-mapping> <filter-name>customCorsFilterConfig</filter-name> <url-pattern>/*</url-pattern></filter-mapping>

Spring Web 的解決方案

配置一個(gè)每次請求都過濾一次的 Filter 就好了

@Configurationpublic class CorsConfig { @Bean public OncePerRequestFilter corsFilter() { return new OncePerRequestFilter() { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {//允許所有來源String allowOrigin = '*';//允許以下請求方法String allowMethods = 'GET,POST,PUT,DELETE,OPTIONS';//允許以下請求頭String allowHeaders = 'Content-Type,X-Token,Authorization';//允許有認(rèn)證信息(cookie)String allowCredentials = 'true';String origin = request.getHeader('Origin');//此處是為了兼容需要認(rèn)證信息(cookie)的時(shí)候不能設(shè)置為 * 的問題response.setHeader('Access-Control-Allow-Origin', origin == null ? allowOrigin : origin);response.setHeader('Access-Control-Allow-Methods', allowMethods);response.setHeader('Access-Control-Allow-Credentials', allowCredentials);response.setHeader('Access-Control-Allow-Headers', allowHeaders);//處理 OPTIONS 的請求if ('OPTIONS'.equals(request.getMethod())) { response.setStatus(HttpServletResponse.SC_OK); return;}filterChain.doFilter(request, response); } }; }}

使用示例

下面是一些簡單的使用 fetch 進(jìn)行跨域請求的示例:

簡單 fetch 請求,和正常使用 fetch 并無區(qū)別

fetch(url) .then(res => res.json()) .then(json => console.log(json)) 表單請求

var fd = new FormData()fd.append(’username’, ’rx’)fd.append(’password’, ’rx’)fetch(url, { method: ’POST’, body: fd,}) .then(res => res.json()) .then(json => console.log(json)) 需要認(rèn)證的請求

fetch(url, { /** * 關(guān)鍵就在這里,代表用戶是否應(yīng)該在跨域的情況下發(fā)送 cookies 和 HTTP Basic authentication 等驗(yàn)信息以及服務(wù)端能否返回 Set-Cookie(服務(wù)端 Session 需要使用這個(gè)向 cookie 中設(shè)置 sessionId)。 * 包含三個(gè)可選值:omit(從不發(fā)送), same-origin(同源才發(fā)送), include(總會發(fā)送) * 參考鏈接:<https://developer.mozilla.org/zh-CN/docs/Web/API/Request/credentials> */ credentials: ’include’,}) .then(res => res.json()) .then(json => console.log(json))

注:如果想要服務(wù)端返回 Set-Cookie(SessionId 也需要通過這個(gè)響應(yīng)屬性去設(shè)置) 就必須設(shè)置這個(gè)請求參數(shù)!

那么,之后在前端跨域請求的時(shí)候就可以愉快地玩耍啦(v^_^)v

以上就是Java 跨域問題的處理方式的詳細(xì)內(nèi)容,更多關(guān)于Java 跨域的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 【星耀裂变】_企微SCRM_任务宝_视频号分销裂变_企业微信裂变增长_私域流量_裂变营销 | 酒吧霸屏软件_酒吧霸屏系统,酒吧微上墙,夜场霸屏软件,酒吧点歌软件,酒吧互动游戏,酒吧大屏幕软件系统下载 | 山东PE给水管厂家,山东双壁波纹管,山东钢带增强波纹管,山东PE穿线管,山东PE农田灌溉管,山东MPP电力保护套管-山东德诺塑业有限公司 | 建筑资质代办-建筑企业资质代办机构-建筑资质代办公司 | 珠海白蚁防治_珠海灭鼠_珠海杀虫灭鼠_珠海灭蟑螂_珠海酒店消杀_珠海工厂杀虫灭鼠_立净虫控防治服务有限公司 | 强效碱性清洗剂-实验室中性清洗剂-食品级高纯氮气发生器-上海润榕科学器材有限公司 | 定制/定做冲锋衣厂家/公司-订做/订制冲锋衣价格/费用-北京圣达信 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | crm客户关系管理系统,销售管理系统,crm系统,在线crm,移动crm系统 - 爱客crm | 【同风运车官网】一站式汽车托运服务平台,验车满意再付款 | 重庆私家花园设计-别墅花园-庭院-景观设计-重庆彩木园林建设有限公司 | 超声波成孔成槽质量检测仪-压浆机-桥梁预应力智能张拉设备-上海硕冠检测设备有限公司 | 高压无油空压机_无油水润滑空压机_水润滑无油螺杆空压机_无油空压机厂家-科普柯超滤(广东)节能科技有限公司 | 青岛侦探_青岛侦探事务所_青岛劝退小三_青岛调查出轨取证公司_青岛婚外情取证-青岛探真调查事务所 | 广州昊至泉水上乐园设备有限公司 | 首页 - 张店继勇软件开发工作室 兰州UPS电源,兰州山特UPS-兰州万胜商贸 | 北京燃气公司 用户服务中心| 贴片电容代理-三星电容-村田电容-风华电容-国巨电容-深圳市昂洋科技有限公司 | 扬尘监测_扬尘监测系统_带证扬尘监测设备 - 郑州港迪科技有限公司 | 盘扣式脚手架-附着式升降脚手架-移动脚手架,专ye承包服务商 - 苏州安踏脚手架工程有限公司 | 播音主持培训-中影人教育播音主持学苑「官网」-中国艺考界的贵族学校 | 陕西华春网络科技股份有限公司| 解放卡车|出口|济南重汽|报价大全|山东三维商贸有限公司 | 测试治具|过炉治具|过锡炉治具|工装夹具|测试夹具|允睿自动化设备 | 医院专用门厂家报价-医用病房门尺寸大全-抗菌木门品牌推荐 | 协议书_协议合同格式模板范本大全 | 济南轻型钢结构/济南铁艺护栏/济南铁艺大门-济南燕翔铁艺制品有限公司 | 超高频感应加热设备_高频感应电源厂家_CCD视觉检测设备_振动盘视觉检测设备_深圳雨滴科技-深圳市雨滴科技有限公司 | 石家庄小程序开发_小程序开发公司_APP开发_网站制作-石家庄乘航网络科技有限公司 | 实战IT培训机构_IT培训班选大学生IT技术培训中心_中公优就业 | 溶氧传感器-pH传感器|哈美顿(hamilton)| 咖啡加盟-咖啡店加盟-咖啡西餐厅加盟-塞纳左岸咖啡西餐厅官网 | 横河变送器-横河压力变送器-EJA变送器-EJA压力变送器-「泉蕴仪表」 | 购买舔盐、舔砖、矿物质盐压块机,鱼饵、鱼饲料压块机--请到杜甫机械 | 青岛球场围网,青岛车间隔离网,青岛机器人围栏,青岛水源地围网,青岛围网,青岛隔离栅-青岛晟腾金属制品有限公司 | 岛津二手液相色谱仪,岛津10A液相,安捷伦二手液相,安捷伦1100液相-杭州森尼欧科学仪器有限公司 | 影像测量仪_三坐标测量机_一键式二次元_全自动影像测量仪-广东妙机精密科技股份有限公司 | 称重传感器,测力传感器,拉压力传感器,压力变送器,扭矩传感器,南京凯基特电气有限公司 | 北京公寓出租网-北京酒店式公寓出租平台| 散热器-电子散热器-型材散热器-电源散热片-镇江新区宏图电子散热片厂家 | 北京发电车出租-发电机租赁公司-柴油发电机厂家 - 北京明旺盛安机电设备有限公司 |