js实现img src更新请求


[javascript] view plain copy
  1. 1.javascript(更新的函数)
[javascript] view plain copy
[javascript] view plain copy
  1. <scripttype="text/javascript">
  2. functionchangeImage(){
  3. varimg=document.getElementById("imgVcode");
  4. if(img.name==1){
  5. img.name=2;
  6. img.src="shop.do?method=registerImage2";
  7. }elseif(img.name==2){
  8. img.name=1;
  9. img.src="shop.do?method=registerImage";
  10. }
  11. }
  12. </script>


2.jsp中img和img改变的代码

[plain] view plain copy
  1. <td>
  2. <imgclass="yzm_img"id='imgVcode'name="1"src="shop.do?method=registerImage"/>
  3. <inputname="code"type="text"id="txtVerifyCode"
  4. class="yzm_input"onblur="testCode(this)"/>
  5. <divclass="text_leftt1">
  6. <pclass="t1">
  7. <spanid="vcodeValidMsg">请输入图片中的四个字母。</span>
  8. <spanid="codeInfo"style="color:red"></span>
  9. <ahref="#"id="imgchange"onclick="changeImage()">看不清楚?换个图片</a>
  10. </p>
  11. </div>
  12. </td>


3.后台action代码

[java] view plain copy
  1. publicActionForwardregisterImage(ActionMappingmapping,ActionFormform,
  2. HttpServletRequestrequest,HttpServletResponseresponse)
  3. throwsException{
  4. //将image创建,返回认证码
  5. response.setContentType("image/jpeg");
  6. OutputStreamout=response.getOutputStream();
  7. StringstrEnsure=shopManager.createImageInfo(50,20,out);
  8. //设置到session中
  9. request.getSession().setAttribute("strEnsure",strEnsure);
  10. returnnull;
  11. }
  12. publicActionForwardregisterImage2(ActionMappingmapping,ActionFormform,
  13. HttpServletRequestrequest,HttpServletResponseresponse)
  14. throwsException{
  15. //将image创建,返回认证码
  16. response.setContentType("image/jpeg");
  17. OutputStreamout=response.getOutputStream();
  18. StringstrEnsure=shopManager.createImageInfo(50,20,out);
  19. //设置到session中
  20. request.getSession().setAttribute("strEnsure",strEnsure);
  21. returnnull;
  22. }
[javascript] view plain copy
  1. 1.javascript(更新的函数)
[javascript] view plain copy
[javascript] view plain copy
  1. <scripttype="text/javascript">
  2. functionchangeImage(){
  3. varimg=document.getElementById("imgVcode");
  4. if(img.name==1){
  5. img.name=2;
  6. img.src="shop.do?method=registerImage2";
  7. }elseif(img.name==2){
  8. img.name=1;
  9. img.src="shop.do?method=registerImage";
  10. }
  11. }
  12. </script>


2.jsp中img和img改变的代码

[plain] view plain copy
  1. <td>
  2. <imgclass="yzm_img"id='imgVcode'name="1"src="shop.do?method=registerImage"/>
  3. <inputname="code"type="text"id="txtVerifyCode"
  4. class="yzm_input"onblur="testCode(this)"/>
  5. <divclass="text_leftt1">
  6. <pclass="t1">
  7. <spanid="vcodeValidMsg">请输入图片中的四个字母。</span>
  8. <spanid="codeInfo"style="color:red"></span>
  9. <ahref="#"id="imgchange"onclick="changeImage()">看不清楚?换个图片</a>
  10. </p>
  11. </div>
  12. </td>


3.后台action代码

[java] view plain copy
  1. publicActionForwardregisterImage(ActionMappingmapping,ActionFormform,
  2. HttpServletRequestrequest,HttpServletResponseresponse)
  3. throwsException{
  4. //将image创建,返回认证码
  5. response.setContentType("image/jpeg");
  6. OutputStreamout=response.getOutputStream();
  7. StringstrEnsure=shopManager.createImageInfo(50,20,out);
  8. //设置到session中
  9. request.getSession().setAttribute("strEnsure",strEnsure);
  10. returnnull;
  11. }
  12. publicActionForwardregisterImage2(ActionMappingmapping,ActionFormform,
  13. HttpServletRequestrequest,HttpServletResponseresponse)
  14. throwsException{
  15. //将image创建,返回认证码
  16. response.setContentType("image/jpeg");
  17. OutputStreamout=response.getOutputStream();
  18. StringstrEnsure=shopManager.createImageInfo(50,20,out);
  19. //设置到session中
  20. request.getSession().setAttribute("strEnsure",strEnsure);
  21. returnnull;
  22. }
### 自定义 `img` 标签 `src` 请求的 HTTP Headers 在浏览器环境中,HTML 的 `<img>` 标签发起的请求无法直接修改其默认的 HTTP Header。这是因为浏览器的安全策略限制了开发者对某些原生行为(如图片加载)的控制能力。然而,可以通过间接方式实现类似功能。 #### 方法一:通过服务端代理解决 如果目标是为图片请求添加自定义 Header,则可以考虑让前端将图片 URL 发送到后端 API,在后端完成带有自定义 Header 的请求并返回图片数据流[^1]。这种方式绕过了浏览器对于 `<img>` 标签的限制。 ```javascript fetch('/api/proxy-image', { method: 'POST', headers: { 'Authorization': 'Bearer your_token_here', 'TenantId': 'your_tenant_id' }, body: JSON.stringify({ imageUrl: 'https://example.com/image.jpg' }) }) .then(response => response.blob()) .then(blob => { const url = URL.createObjectURL(blob); document.querySelector('img').src = url; }); ``` 上述代码展示了如何通过 Fetch API 向服务器发送携带自定义 Header 的 POST 请求,并接收处理后的图片 Blob 数据作为响应[^4]。 --- #### 方法二:使用 Canvas 绘制图像 另一种方法是在 JavaScript 中利用 XMLHttpRequest 或 Axios 下载图片资源的同时附加必要的 Header 配置,之后借助 HTML5 Canvas 将下载的数据渲染成实际可见的内容[^2]: ```javascript const xhr = new XMLHttpRequest(); xhr.open('GET', 'https://example.com/secure_image.png'); xhr.setRequestHeader('Authorization', 'Bearer token_value'); // 设置自定义Header xhr.responseType = 'blob'; xhr.onload = function () { if (this.status === 200) { const imgBlobUrl = URL.createObjectURL(this.response); const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); const imageElement = new Image(); imageElement.src = imgBlobUrl; imageElement.onload = function () { canvas.width = this.naturalWidth; canvas.height = this.naturalHeight; ctx.drawImage(imageElement, 0, 0); // 可选操作:将Canvas转换回Base64编码字符串供进一步使用 const base64Data = canvas.toDataURL('image/png'); console.log(base64Data); // 替换原有<IMG>节点显示效果 document.getElementById('targetImage').src = base64Data; }; } }; xhr.send(); ``` 此方案允许完全掌控整个流程,包括但不限于调整尺寸、应用滤镜等功能[^3]。 --- #### 方法三:Vue.js 场景下的解决方案 针对 Vue 应用场景下遇到的问题——即希望动态绑定图片路径至组件模板内的 `<img>` 元素上时能够支持额外的身份认证机制等问题,推荐采用如下模式来预取经过鉴权保护的目标媒体文件后再赋值给视图层控件属性: ```javascript methods: { async loadImageWithAuth(url) { try { const result = await axios({ url, responseType: 'arraybuffer', headers: { Authorization: localStorage.getItem('authToken') || '' } }); return `data:image/jpeg;base64,${btoa( String.fromCharCode(...new Uint8Array(result.data)) )}`; } catch (error) { throw error; } } } ``` 随后可以在页面初始化阶段或者事件触发过程中调用以上函数实例化 Base64 编码形式的结果用于更新 DOM 结构中的对应字段值。 --- ### 总结 由于安全原因,标准 HTML `<img>` 元素本身并不提供任何内置手段去改变它所发出 GET 请求附带的信息头项集合;但是,这并不代表完全没有可行的办法达成目的。具体选择取决于项目需求和技术栈特点等因素综合考量决定最佳实践方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值