跨域請求的問題
- 問題說明
- 解決辦法
問題說明
同源策略是一個重要的安全策略,它用于限制一個origin的檔案或者它加載的腳本如何能與另一個源的資源進行互動,它能幫助阻隔惡意檔案,減少可能被攻擊的媒介,但是有時我們想訪問時就會遇到跨域請求的限制,在這里說一下解決方案,
需要訪問后端資料的前端表格代碼:
<template>
<div>
<el-table :data="tableData" style="width: 100%" size="mini">
<el-table-column
prop="name"
label="直接顯示名字"
width="180">
</el-table-column>
<el-table-column label="日期" width="180">
<template slot-scope="scope">
<i class="el-icon-time"></i>
<span style="margin-left: 10px">{{ scope.row.date }}</span>
</template>
</el-table-column>
<el-table-column label="姓名" width="180">
<template slot-scope="scope">
<el-popover trigger="hover" placement="top">
<p>姓名: {{ scope.row.name }}</p>
<p>住址: {{ scope.row.address }}</p>
<div slot="reference" class="name-wrapper">
<el-tag size="medium">{{ scope.row.name }}</el-tag>
</div>
</el-popover>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button size="mini" @click="handleEdit(scope.$index, scope.row)">編輯</el-button>
<el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">洗掉</el-button>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import axios from 'axios'
export default {
name: 'Table',
components: {
},
data() {
return {
tableData: []
}
},
methods: {
},
created() { // 看這里,看這里,看這里!!!!!
//請求后端的資料,后端不進行處理時,這樣是訪問不到資料,會遇到跨域請求的問題
axios.get('http://127.0.0.1:8080/web/user')
//在前端寫死的json資料,用來測驗訪問的
// axios.get('stu.json')
.then((res)=>{
this.tableData = res.data
})
.catch(function (error) {
console.log(error);
});
}
}
</script>
<style>
</style>
前端表格中的created()的代碼:
created() {
//請求后端的資料,后端不進行處理時,這樣是訪問不到資料,會遇到跨域請求的問題
axios.get('http://127.0.0.1:8080/web/user')
//在前端寫死的json資料,用來測驗訪問的
// axios.get('stu.json')
.then((res)=>{
this.tableData = res.data
})
.catch(function (error) {
console.log(error);
});
}
后端的UserController代碼:
package com.neuedu.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.neuedu.entity.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* Keafmd
*
* @ClassName: UserController
* @Description: UserController
* @author: 牛哄哄的柯南
* @date: 2020-12-17 14:20
*
*
* http://127.0.0.1:8080/web/user
*/
@WebServlet(name="UserController" ,urlPatterns = "/user")
public class UserController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//可以從資料庫獲取,我們后端這里暫時這樣寫,
List userList = new ArrayList();
userList.add(new User(1,"牛哄哄的柯南1","某某省某某市1",new Date()));
userList.add(new User(2,"牛哄哄的柯南2","某某省某某市2",new Date()));
userList.add(new User(3,"牛哄哄的柯南3","某某省某某市3",new Date()));
userList.add(new User(4,"牛哄哄的柯南4","某某省某某市4",new Date()));
userList.add(new User(5,"牛哄哄的柯南5","某某省某某市5",new Date()));
userList.add(new User(6,"牛哄哄的柯南6","某某省某某市6",new Date()));
String json = JSON.toJSONString(userList, SerializerFeature.WriteDateUseDateFormat );
//轉換格式,讓前端接收
resp.setContentType("application/json");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
out.write(json);
out.flush();
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
直接訪問http://127.0.0.1:8080/web/user時顯示的是一個json物件,當我們使用80埠訪問前端代碼時,因為前端會通過8080埠請求后端的json物件,這時需要同時訪問后端的8080的埠和前端的80埠,這種情況瀏覽器默認是不允許的,這時就會出現跨域請求的問題,
解決辦法
解決辦法就是我們在后端設定resp.addHeader("Access-Control-Allow-Origin","*");允許同時訪問,最好是寫個過濾器,
在后端寫個CrossFilter過濾器,
CrossFilter代碼:
package com.neuedu.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Keafmd
*
* @ClassName: CrossFilter
* @Description:
* @author: 牛哄哄的柯南
* @date: 2020-12-17 14:47
*/
//過濾所有的
@WebFilter(urlPatterns = "/*")
public class CrossFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletResponse resp = (HttpServletResponse) response;
resp.addHeader("Access-Control-Allow-Origin","*");
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
看完如果對你有幫助,感謝點贊支持!
如果你是電腦端,看到右下角的 “一鍵三連” 了嗎,沒錯點它[哈哈]

加油!
共同努力!
Keafmd
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/236613.html
標籤:其他
上一篇:html基礎語法總結
