前后端解决跨域问题

一、 axios实现ajax

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

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

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

    response.setCharacterEncoding("utf-8");
    response.setContentType("text/json;charset=utf-8");
    /** 设置响应头允许ajax跨域访问 **/
    HttpServletResponse rp=(HttpServletResponse)response;
    HttpServletRequest req=(HttpServletRequest) request;
rp.setCharacterEncoding("utf-8");
    rp.setContentType("text/json;charset=utf-8");
    req.setCharacterEncoding("utf-8");
    String origin="*";
    if(req.getHeader("Origin")!=null){
    origin=req.getHeader("Origin");
    }
    rp.setHeader("Access-Control-Allow-Origin", origin);
rp.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
rp.setHeader("Access-Control-Max-Age", "3600");
rp.setHeader("Access-Control-Allow-Headers", "x-requested-with, Content-Type, token");
rp.setHeader("Access-Control-Allow-Credentials", "true");
chain.doFilter(request, rp);

}

springboot解决办法:

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

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

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

@Configuration
public class CrossInterceptor implements WebMvcConfigurer {
    //允许跨域请求
    public void addCorsMappings(CorsRegistry registry) {
        System.out.println("......跨域执行......");
        registry.addMapping("/**")
                .allowedHeaders("*")
                .allowedOrigins("*")
                .allowedMethods("GET","POST","PUT","OPTIONS")
                .allowCredentials(true)
                .maxAge(5000);
    }
}

二、axios多种参数传递方式

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

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

controller

 @RequestMapping("/insert")
    //返回json形式
    public String insert(@RequestBody Admin a){
        try {
            as.save(a);
            System.out.println("录入成功");
            return "1";
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "0";
    }

2、单值传递

简单方式:

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

controller---实现删除操作

@RequestMapping("/delete")
    public String delete(String aid){
        try {
            as.removeById(aid);
            System.out.println("删除成功");
            return "1";
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "0";
    }

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

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

res是相应数据

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

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

controller

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

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

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

admin.xml(02vue)

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			/* 激活  高亮显示 */
			.active{
				color: red;
				background-color: #409EFF;
			}
		</style>
	</head>
	<body>
		<div id="app">
			<!-- 删除 -->
			<div v-show="show">
				<table border="" cellspacing="" cellpadding="">
					<tr>
						<th>编号</th>
						<th>姓名</th>
						<th>密码</th>
						<th>角色</th>
						<th>备注</th>
						<th>操作</th>
					</tr>
					<tr v-for="(a,i) in list" :class="{active: i==j}" @mousemove="j=i" @mouseout="j=100">
						<!-- 把当前行的信息放入到表单里 {}写当前行数据  -->
						<td><a href="javascript:;" @click="show=false,vm.a=a,action='update'">{{a.aid}}</a></td>
						<td>{{a.aname}}</td>
						<td>{{a.apwd}}</td>
						<td>{{a.rid}}</td>
						<td>{{a.abackup}}</td>
						<td>
							<button @click="deladmin(i)">删除</button>
							<button  type="button"  @click="show=false,vm.a=a,action='update'">更新</button>					
						</td>
					</tr>				
				</table>
				<!-- a={}重新赋值一下 -->
				<button @click="show=false,a={},action='insert'" >添加</button>
			</div>
			<!-- 录入和修改 -->
			<div v-show="!show">
				<form action="" method="">
					编号:<input v-model="a.aid" /><br />
					姓名:<input v-model="a.aname" /><br />
					密码:<input v-model="a.apwd" /><br />
					角色:<input v-model="a.rid" /><br />
					备注:<input v-model="a.abackup" /><br />
					<!-- 走的都是ajax  按钮:button -->
					<button type="button" @click="insadmin()">操作</button>
					<button @click="show=true">返回</button>
				</form>
			</div>
			
		</div>
		<script src="js/axios.min.js" type="text/javascript" charset="utf-8"></script>
		<script src="js/vue.min.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			var vm = new Vue({
				el:'#app',
				data:{
					show:true,
					list:[],
					a:{},
					action: '',
					j: 0,
				},
				//页面加载的时候把值加载出来,交给list绑定,再把数据展示出来
				created() {
					//统一解决路径问题
					axios.defaults.baseURL="http://localhost:9090/";
					axios.post("admin/selectList").then(function(res){
						//取出的结果res给list
						vm.list=res.data
					})
				},
				methods:{
					/* 变成动态方法,可实现录入和更新 */
					insadmin(){
						axios.post("admin/"+this.action, this.a).then(function(res){
							if(res.data=="1"){
								alert("操作成功")
								//vm.list.push(vm.a)
								if (vm.action =='insert') {
									vm.list.push(vm.a)
									vm.a={}
								}
							}else{
								alert("操作失败")
							}
						})
					},
					deladmin(i){
						axios.post("admin/delete",'aid='+this.list[i].aid).then(function(res){
							if(res.data=="1"){
								alert("删除成功")
								vm.list.splice(i,1)
							}else{
								alert("删除失败")
							}
						})
					}
					
				}
			})
		</script>
	</body>
</html>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值