• 前后端解决跨域问题


    一、 axios实现ajax

    跨域问题:ajax请求不同源---ip地址、端口、项目路径(三者不同源,不允许处理ajax请求)

    解决办法:response设置安全的响应头

    1. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    2. response.setCharacterEncoding("utf-8");
    3. response.setContentType("text/json;charset=utf-8");
    4. /** 设置响应头允许ajax跨域访问 **/
    5. HttpServletResponse rp=(HttpServletResponse)response;
    6. HttpServletRequest req=(HttpServletRequest) request;
    7. rp.setCharacterEncoding("utf-8");
    8. rp.setContentType("text/json;charset=utf-8");
    9. req.setCharacterEncoding("utf-8");
    10. String origin="*";
    11. if(req.getHeader("Origin")!=null){
    12. origin=req.getHeader("Origin");
    13. }
    14. rp.setHeader("Access-Control-Allow-Origin", origin);
    15. rp.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
    16. rp.setHeader("Access-Control-Max-Age", "3600");
    17. rp.setHeader("Access-Control-Allow-Headers", "x-requested-with, Content-Type, token");
    18. rp.setHeader("Access-Control-Allow-Credentials", "true");
    19. chain.doFilter(request, rp);
    20. }

    springboot解决办法:

    方案一:实现跨域过滤器(在主方法里写)

    1. @Bean
    2. public CorsFilter corsFilter() {
    3. final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    4. final CorsConfiguration config = new CorsConfiguration();
    5. config.setAllowCredentials(true); // 允许cookies跨域
    6. config.addAllowedOrigin("*");// 允许向该服务器提交请求的URI,*表示全部允许。。这里尽量限制来源域,比如http://xxxx:8080 ,以降低安全风险。。
    7. config.addAllowedHeader("*");// 允许访问的头信息,*表示全部
    8. config.setMaxAge(18000L);// 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了
    9. config.addAllowedMethod("*");// 允许提交请求的方法,*表示全部允许,也可以单独设置GET、PUT等
    10. // config.addAllowedMethod("HEAD");
    11. // config.addAllowedMethod("GET");// 允许Get的请求方法
    12. // config.addAllowedMethod("PUT");
    13. // config.addAllowedMethod("POST");
    14. // config.addAllowedMethod("DELETE");
    15. // config.addAllowedMethod("PATCH");
    16. source.registerCorsConfiguration("/**", config);
    17. System.out.println("----------跨域处理------------");
    18. return new CorsFilter(source);
    19. }

    方案一:实现跨域拦截器---在com.sxl下创建此类

    1. @Configuration
    2. public class CrossInterceptor implements WebMvcConfigurer {
    3. //允许跨域请求
    4. public void addCorsMappings(CorsRegistry registry) {
    5. System.out.println("......跨域执行......");
    6. registry.addMapping("/**")
    7. .allowedHeaders("*")
    8. .allowedOrigins("*")
    9. .allowedMethods("GET","POST","PUT","OPTIONS")
    10. .allowCredentials(true)
    11. .maxAge(5000);
    12. }
    13. }

    二、axios多种参数传递方式

    1、接收axios传递的json数据,必须加@RequestBody,单值无法接收

    1. axios.post("http://localhost:9090/admin/insert", {aid:5,apwd:5,aname:5}).then(function (res) {
    2. if(res.data == "1"){
    3. console.log("ok")
    4. }else{
    5. console.log("fail")
    6. }
    7. })

    controller

    1. @RequestMapping("/insert")
    2. //返回json形式
    3. public String insert(@RequestBody Admin a){
    4. try {
    5. as.save(a);
    6. System.out.println("录入成功");
    7. return "1";
    8. } catch (Exception e) {
    9. e.printStackTrace();
    10. }
    11. return "0";
    12. }

    2、单值传递

    简单方式:

    1. axios.post("http://localhost:9090/admin/delete","aid=14").then(function(res){
    2. if(res.data=="1"){
    3. console.log("ok")
    4. }else{
    5. console.log("fail")
    6. }
    7. })

    controller---实现删除操作

    1. @RequestMapping("/delete")
    2. public String delete(String aid){
    3. try {
    4. as.removeById(aid);
    5. System.out.println("删除成功");
    6. return "1";
    7. } catch (Exception e) {
    8. e.printStackTrace();
    9. }
    10. return "0";
    11. }

    3、URLSearchParams方式传递单值和多值(axios官网提供)

    这个方法在axios的官网中有介绍,除了这个方法还有qs这个方法

    res是相应数据

    实现单值传递:----selectOne

    1. //URLSearchParams方式传参,不传json
    2. var param = new URLSearchParams();
    3. param.append("aid","1");
    4. param.append("aname","任柏熙");
    5. axios.post("http://localhost:9090/admin/selectOne",param).then(function(res){
    6. console.log(res.data);
    7. })

    controller

    1. @RequestMapping("/selectOne")
    2. public Admin selectOne(String aid){
    3. Admin admin = as.getById(aid);
    4. System.out.println("查询成功");
    5. return admin;
    6. }

    实现多值传递----批量删除

    1. var param = new URLSearchParams();
    2. param.append("aid",['12','13']);
    3. axios.post("http://localhost:9090/admin/deleteList",param).then(function(res){
    4. console.log(res.data);
    5. })
    1. //批量删除
    2. @RequestMapping("/deleteList")
    3. public String deleteList(String[] aid){
    4. try {
    5. //把数组转换为集合
    6. as.removeByIds(Arrays.asList(aid));
    7. System.out.println(aid + "删除成功");
    8. return "1";
    9. } catch (Exception e) {
    10. e.printStackTrace();
    11. }
    12. return "0";
    13. }

    admin.xml(02vue)

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>title>
    6. <style type="text/css">
    7. /* 激活 高亮显示 */
    8. .active{
    9. color: red;
    10. background-color: #409EFF;
    11. }
    12. style>
    13. head>
    14. <body>
    15. <div id="app">
    16. <div v-show="show">
    17. <table border="" cellspacing="" cellpadding="">
    18. <tr>
    19. <th>编号th>
    20. <th>姓名th>
    21. <th>密码th>
    22. <th>角色th>
    23. <th>备注th>
    24. <th>操作th>
    25. tr>
    26. <tr v-for="(a,i) in list" :class="{active: i==j}" @mousemove="j=i" @mouseout="j=100">
    27. <td><a href="javascript:;" @click="show=false,vm.a=a,action='update'">{{a.aid}}a>td>
    28. <td>{{a.aname}}td>
    29. <td>{{a.apwd}}td>
    30. <td>{{a.rid}}td>
    31. <td>{{a.abackup}}td>
    32. <td>
    33. <button @click="deladmin(i)">删除button>
    34. <button type="button" @click="show=false,vm.a=a,action='update'">更新button>
    35. td>
    36. tr>
    37. table>
    38. <button @click="show=false,a={},action='insert'" >添加button>
    39. div>
    40. <div v-show="!show">
    41. <form action="" method="">
    42. 编号:<input v-model="a.aid" /><br />
    43. 姓名:<input v-model="a.aname" /><br />
    44. 密码:<input v-model="a.apwd" /><br />
    45. 角色:<input v-model="a.rid" /><br />
    46. 备注:<input v-model="a.abackup" /><br />
    47. <button type="button" @click="insadmin()">操作button>
    48. <button @click="show=true">返回button>
    49. form>
    50. div>
    51. div>
    52. <script src="js/axios.min.js" type="text/javascript" charset="utf-8">script>
    53. <script src="js/vue.min.js" type="text/javascript" charset="utf-8">script>
    54. <script type="text/javascript">
    55. var vm = new Vue({
    56. el:'#app',
    57. data:{
    58. show:true,
    59. list:[],
    60. a:{},
    61. action: '',
    62. j: 0,
    63. },
    64. //页面加载的时候把值加载出来,交给list绑定,再把数据展示出来
    65. created() {
    66. //统一解决路径问题
    67. axios.defaults.baseURL="http://localhost:9090/";
    68. axios.post("admin/selectList").then(function(res){
    69. //取出的结果res给list
    70. vm.list=res.data
    71. })
    72. },
    73. methods:{
    74. /* 变成动态方法,可实现录入和更新 */
    75. insadmin(){
    76. axios.post("admin/"+this.action, this.a).then(function(res){
    77. if(res.data=="1"){
    78. alert("操作成功")
    79. //vm.list.push(vm.a)
    80. if (vm.action =='insert') {
    81. vm.list.push(vm.a)
    82. vm.a={}
    83. }
    84. }else{
    85. alert("操作失败")
    86. }
    87. })
    88. },
    89. deladmin(i){
    90. axios.post("admin/delete",'aid='+this.list[i].aid).then(function(res){
    91. if(res.data=="1"){
    92. alert("删除成功")
    93. vm.list.splice(i,1)
    94. }else{
    95. alert("删除失败")
    96. }
    97. })
    98. }
    99. }
    100. })
    101. script>
    102. body>
    103. html>

  • 相关阅读:
    dotnet-dump工具使用
    uni-app:实现密码框内容展示与隐藏
    4 天 7 条 PR,80% 代码覆盖率,开源是「内卷」还是修炼?
    教你1分钟搞定2小时字幕
    数据提交类型 Request Payload 与 Form Data 的区别总结
    JZ6 从尾到头打印链表
    React 高阶组件
    同事问我飞速代码背后的秘密,我望着他笑着拿出了MybatisPlus~
    【数据库】SQL 过滤数据
    mysql之备份和恢复
  • 原文地址:https://blog.csdn.net/m0_54435916/article/details/127776365