当前位置:   article > 正文

前端异步请求并解决跨域问题(Ajax+axios框架)、后端响应多个数据(JSON)_前端ajax解决跨域

前端ajax解决跨域

目录

一、前后端同步异步请求

1.同步请求:

2.异步请求:

3.跨域问题(前端问题)

4.axios框架(封装后)

二、后端向前端响应多个数据-JSON


一、前后端同步异步请求

1.同步请求:

        发送一个请求,回应请求,回应的内容会覆盖浏览器中的内容,这样会打断前端其他的正常操作。

2.异步请求

        不同步,可以使用js中提供的对象,向后发送请求,服务器响应的内容会被js对象接收,在js中接收到的内容,局部更新网页,就不会刷新页面。

        Ajax:无刷新状态更新页面,并且实现异步提交,提升用户体验。利用浏览器提供的一个特殊的对象(XMLHttpRequest)异步地向服务器发送请求 。

3.跨域问题(前端问题)

前后端分离时存在的问题,跨域是指从一个域名的网页去请求另一个域名的资源,只要 协议域名端口有任何一个的不同,就被当作是跨域。

使用Ajax技术前后端交互,前端会默认进行阻止,不让前端接收其他后端的数据。

3.1解决方式:

        后端解决:在响应头中设置说明,告知浏览器,此次的响应是可靠的。

        创建一个过滤器解决跨域问题。

  1. package com.yyds.webback2.filter;
  2. import javax.servlet.*;
  3. import javax.servlet.annotation.WebFilter;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. @WebFilter(urlPatterns = "/*")
  8. public class CorsFilter implements Filter {
  9. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
  10. throws IOException, ServletException {
  11. HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
  12. HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
  13. //允许携带Cookie时不能设置为* 否则前端报错
  14. httpResponse.setHeader("Access-Control-Allow-Origin", httpRequest.getHeader("origin"));//允许所有请求跨域
  15. httpResponse.setHeader("Access-Control-Allow-Methods", "*");//允许跨域的请求方法GET, POST, HEAD 等
  16. httpResponse.setHeader("Access-Control-Allow-Headers", "*");//允许跨域的请求头
  17. httpResponse.setHeader("Access-Control-Allow-Credentials", "true");//是否携带cookie
  18. filterChain.doFilter(servletRequest, servletResponse);
  19. }
  20. }

         配置解决跨域过滤器:

  1. <filter>
  2. <filter-name>csf</filter-name>
  3. <filter-class>com.yyds.webback2.filter.CorsFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>csf</filter-name>
  7. <url-pattern>/*</url-pattern>
  8. </filter-mapping>

         前端基于Ajax异步交互(原生态):

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title></title>
  6. <script>
  7. function checkAccount(account){
  8. var httpobj = new XMLHttpRequest();
  9. httpobj.open("get","http://127.0.0.1:8080/webBack2/reg?account="+account,true);
  10. httpobj.send();
  11. httpobj.onreadystatechange=function(){
  12. //接收后端响应的数据
  13. // alert(httpobj.responseText);
  14. document.getElementById("aid").innerHTML = httpobj.responseText;
  15. }
  16. }
  17. </script>
  18. </head>
  19. <body>
  20. <form>
  21. 用户<input type="text" name="account" value="" onblur="checkAccount(this.value)"/><span id="aid"></span><br />
  22. 密码<input type="text" name="psd" value=""/><br />
  23. </form>
  24. </body>
  25. </html>

        后端响应:

  1. package com.yyds.webback2.servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. import java.io.PrintWriter;
  8. public class RegServlet extends HttpServlet {
  9. @Override
  10. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  11. resp.setHeader("Content-Type","text/html;charset=utf-8");
  12. PrintWriter pt = resp.getWriter();
  13. String account = req.getParameter("account");
  14. if (account.equals("admin")){
  15. pt.write("账号已经存在");
  16. }else {
  17. pt.write("成功注册");
  18. }
  19. }
  20. }

        效果:

 

4.axios框架(封装后)

官方下载axios.min.js,将包放入前端js文件夹中,然后在前端页面导入使用框架

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title></title>
  6. <script src="js/axios.min.js" type="text/javascript"></script>
  7. <script>
  8. function checkAccount(account){
  9. axios.get("http://127.0.0.1:8080/webBack2/reg?account="+account).then(function(resp){
  10. // console.log(resp.data);
  11. document.getElementById("aid").innerHTML = resp.data;
  12. })
  13. // axios.post("http://127.0.0.1:8080/webBack2/reg","account="+account+"&age=20").then(function(resp){
  14. // document.getElementById("aid").innerHTML = resp.data;
  15. // })
  16. }
  17. </script>
  18. </head>
  19. <body>
  20. <form method="post">
  21. 用户<input type="text" name="account" value="" onblur="checkAccount(this.value)"/><span id="aid"></span><br />
  22. 密码<input type="text" name="psd" value=""/><br />
  23. </form>
  24. </body>
  25. </html>

二、后端向前端响应多个数据-JSON

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式

将数据封装到对象中响应到前端,首先向后端加载JSON包 :

json包中有ObjectMapper() 类:将封装的对象转为json形式,即转为字符串。

 例如响应一个Student对象:

后端:使用doPost

  1. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  2. resp.setHeader("Content-Type","text/html;charset=utf-8");
  3. PrintWriter pt = resp.getWriter();
  4. String num = req.getParameter("num");
  5. Student student = new Student(num,"张三","男","12345678910");
  6. ObjectMapper objectMapper = new ObjectMapper();
  7. String s = objectMapper.writeValueAsString(student);
  8. System.out.println(s);
  9. resp.getWriter().print(s);
  10. }

前端:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title></title>
  6. <script src="js/axios.min.js" type="text/javascript"></script>
  7. <script>
  8. function checkAccount(num){
  9. axios.post("http://127.0.0.1:8080/webBack2/reg","num="+num).then(function(resp){
  10. // document.getElementById("aid").innerHTML = resp.data;
  11. console.log(resp.data.num);
  12. console.log(resp.data.name);
  13. console.log(resp.data.gender);
  14. console.log(resp.data.phone);
  15. })
  16. }
  17. </script>
  18. </head>
  19. <body>
  20. <form method="post">
  21. 学号<input type="text" name="num" value="" onblur="checkAccount(this.value)"/><br />
  22. <!-- <span id="aid"></span><br /> -->
  23. </form>
  24. </body>
  25. </html>

前端接收到的数据:

 ObjectMapper() 类将student对象转为了json形式,属于String 类,如下:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/691202
推荐阅读
相关标签
  

闽ICP备14008679号