跨域问题记录

//拦截器中
HttpServletRequest request = (HttpServletRequest)req;
response.setHeader("Access-Control-Allow-Origin", "*");

### 解决问题并生成文章列表 在使用 Vue.js 调用 `https://www.vue-js.com/api/v1/topics` API 生成包含标题、日期和作者的文章列表时,可以通过以下方式解决问题并实现分页功能。 --- #### 解决问题 问题通常发生在前端应用尝试从不同源的服务器获取资源时。为了解决这一问题,可以采用以下两种方法之一: 1. **后端代理**:通过配置 Webpack 的 `devServer.proxy` 属性,将请求转发到目标 API 地址[^4]。 2. **CORS 配置**:如果目标 API 支持 CORS,则需要确保服务器端正确设置了 `Access-Control-Allow-Origin` 头部[^3]。 以下是基于 Webpack 的后端代理配置示例: ```javascript // webpack.config.js module.exports = { devServer: { disableHostCheck: true, proxy: { '/api': { target: 'https://www.vue-js.com', ws: true, changeOrigin: true, pathRewrite: { '^/api': '' // 将 /api 替换为空字符串 } } } } }; ``` 通过上述配置,前端可以向 `/api/v1/topics` 发起请求,而 Webpack 会自动将其转发至目标地址 `https://www.vue-js.com/api/v1/topics`。 --- #### 获取数据并生成文章列表 为了生成包含标题、日期和作者的文章列表,可以使用 Vue.js 的 `axios` 库发起 HTTP 请求,并结合分页逻辑展示数据。 以下是完整的代码实现: ```vue <template> <div> <!-- 文章列表 --> <ul> <li v-for="article in paginatedArticles" :key="article.id"> <h3>{{ article.title }}</h3> <p>日期: {{ formatDate(article.create_at) }}</p> <p>作者: {{ article.author.loginname }}</p> </li> </ul> <!-- 分页按钮 --> <div> <button @click="currentPage = Math.max(currentPage - 1, 1)" :disabled="currentPage === 1"> 上一页 </button> <span>第 {{ currentPage }} 页 / 共 {{ totalPages }} 页</span> <button @click="currentPage = Math.min(currentPage + 1, totalPages)" :disabled="currentPage === totalPages"> 下一页 </button> </div> </div> </template> <script> import axios from 'axios'; export default { data() { return { articles: [], // 存储从API获取的文章数据 currentPage: 1, // 当前页码 pageSize: 5, // 每页显示的记录数 }; }, computed: { // 计算当前页需要展示的文章 paginatedArticles() { const start = (this.currentPage - 1) * this.pageSize; const end = start + this.pageSize; return this.articles.slice(start, end); }, // 总页数 totalPages() { return Math.ceil(this.articles.length / this.pageSize); }, }, methods: { // 格式化日期 formatDate(dateString) { const date = new Date(dateString); return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`; }, // 获取文章数据 fetchArticles() { axios.get('/api/v1/topics') // 使用后端代理避免 .then((response) => { this.articles = response.data.data.map((item) => ({ id: item.id, title: item.title, create_at: item.create_at, author: item.author, })); }) .catch((error) => { console.error('Error fetching articles:', error); }); }, }, created() { this.fetchArticles(); // 在组件创建时获取数据 }, }; </script> ``` --- #### 关键点解析 1. **数据格式化**:从 API 返回的数据中提取 `title`、`create_at` 和 `author.loginname` 字段,并对日期进行格式化处理[^1]。 2. **分页逻辑**:通过计算属性 `paginatedArticles` 和 `totalPages` 实现分页功能,动态展示每页的 5 条记录[^2]。 3. **解决方案**:通过 Webpack 的 `devServer.proxy` 配置解决问题,确保前端能够正常访问目标 API[^4]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值