• spa之解决ajax跨域问题


    今天给大家带来用户spa单页面应用程序实现登陆、注册功能,如果哪里不对,请多多指教。

    npm install element-ui -S
    

     

    1 导入组件

    打开 src目录下的main.js,该文件是项目的入口文件,所以在这里导入,其他组件均可使用,不用再导入。

    1. import Vue from 'vue'
    2. //新添
    3. import ElementUI from 'element-ui'
    4. //新增
    5. import 'element-ui/lib/theme-chalk/index.css'
    6. //新增
    7. Vue.use(ElementUI)
    8. 。。。

    2 创建登录页面

    2.1 创建登录组件 

    1) 新建views目录,在目录上右击,选择新建vue(简单模块)创建Login

    1. <template>
    2. template>
    3. <script>
    4. script>
    5. <style>
    6. style>

    2)在element-ui组件,在form组件中找到与登录页面类似的组件,拷贝代码到刚新建的Login组件中,修改为自己需要的登录页面,页面包含:账户,密码, 提交按钮

    1. <template>
    2. <div>
    3. <el-form >
    4. <el-form-item label="账户" >
    5. <el-input type="password" v-model="userName" autocomplete="off">el-input>
    6. el-form-item>
    7. <el-form-item label="密码" >
    8. <el-input type="password" v-model="passWord" autocomplete="off">el-input>
    9. el-form-item>
    10. <el-form-item>
    11. <el-button type="primary" @click="submitForm('ruleForm')">提交el-button>
    12. el-form-item>
    13. el-form>
    14. div>
    15. template>
    16. <script>
    17. export default {
    18. name: 'Login',
    19. data: function() {
    20. return {
    21. userName: null,
    22. passWord: null,
    23. }
    24. },
    25. methods: {
    26. submitForm: function() {
    27. console.log("fdfdd");
    28. }
    29. }
    30. }
    31. script>
    32. <style>
    33. style>

    2.3 配置路由

    router/index.js

    1. import Vue from 'vue'
    2. import Router from 'vue-router'
    3. import HelloWorld from '@/components/HelloWorld'
    4. //首先导入组件
    5. import Login from '@/views/Login'
    6. Vue.use(Router)
    7. export default new Router({
    8. routes: [
    9. {
    10. //配置路由,根路径访问Login组件
    11. path: '/',
    12. name: 'Login',
    13. component: Login
    14. }
    15. ]

    3 发送get请求:

    跳转到后台指定路径http://localhost:8080/usermsg/login'如下

    1. @RequestMapping("usermsg/login")
    2. public Object login(User user) {
    3. Map map = new HashMap<>();
    4. if("admin".equals(user.getUserNo()) && "123".equals(user.getUserPwd())) {
    5. map.put("success", true);
    6. map.put("msg", "密码正确");
    7. } else {
    8. map.put("success", false);
    9. map.put("msg", "密码不正确");
    10. }
    11. return map;
    12. }

    出现跨域请求问题

    因为我们采用的是前后端分离的方式进行开发,前端和后端分别泡在不同的服务器上,基于安全性考虑,浏览器有同源策略,所以出现了跨域问题。
    同源策略[same origin policy]是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。 同源策略是浏览器安全的基石。 

     

    4)跨域问题的处理
    在filter中处理跨域问题,关键代码:

    1. // Access-Control-Allow-Origin就是我们需要设置的域名
    2. // Access-Control-Allow-Headers跨域允许包含的头。
    3. // Access-Control-Allow-Methods是允许的请求方式
    4. httpResponse.setHeader("Access-Control-Allow-Origin", "*");// *,任何域名
    5. httpResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    6. httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE");
    7. filterChain.doFilter(servletRequest, servletResponse);

    配置到web.xml中,对所以请求进行拦截处理,可解决跨域问题。

    1. <filter>
    2. <filter-name>corsFilterfilter-name>
    3. <filter-class>com.zking.vueserver.util.CorsFilterfilter-class>
    4. filter>
    5. <filter-mapping>
    6. <filter-name>corsFilterfilter-name>
    7. <url-pattern>/*url-pattern>
    8. filter-mapping>

     

    CorsFilter拦截器

    1. package com.zking.vueserver.util;
    2. import java.io.IOException;
    3. import javax.servlet.Filter;
    4. import javax.servlet.FilterChain;
    5. import javax.servlet.FilterConfig;
    6. import javax.servlet.ServletException;
    7. import javax.servlet.ServletRequest;
    8. import javax.servlet.ServletResponse;
    9. import javax.servlet.http.HttpServletRequest;
    10. import javax.servlet.http.HttpServletResponse;
    11. /**
    12. * 配置tomcat允许跨域访问
    13. *
    14. * @author Administrator
    15. *
    16. */
    17. public class CorsFilter implements Filter {
    18. @Override
    19. public void init(FilterConfig filterConfig) throws ServletException {
    20. }
    21. @Override
    22. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
    23. throws IOException, ServletException {
    24. HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
    25. HttpServletRequest req = (HttpServletRequest) servletRequest;
    26. // Access-Control-Allow-Origin就是我们需要设置的域名
    27. // Access-Control-Allow-Headers跨域允许包含的头。
    28. // Access-Control-Allow-Methods是允许的请求方式
    29. httpResponse.setHeader("Access-Control-Allow-Origin", "*");// *,任何域名
    30. httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE");
    31. httpResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept,jwt");
    32. //允许客户端,处理一个新的响应头jwt
    33. httpResponse.setHeader("Access-Control-Expose-Headers", "jwt");
    34. // axios的ajax会发两次请求,第一次提交方式为:option,直接返回即可
    35. if ("OPTIONS".equals(req.getMethod())) {
    36. return;
    37. }
    38. filterChain.doFilter(servletRequest, servletResponse);
    39. }
    40. @Override
    41. public void destroy() {
    42. }
    43. }

     

  • 相关阅读:
    【Matlab】【第7届数维杯B】疫情爆发后小区的核酸检测分组方案
    我的创作纪念日——创作者2年
    分片架构&分区架构
    【Web前端】标签大全HTML/CSS/JavaScript
    hitTest的基本用法
    【计算机视觉40例】案例39:易容术(换脸术、合成人脸)
    WPF自定义控件与样式(14)-轻量MVVM模式实践
    01背包、完全背包、多重背包、分组背包总结
    java毕业设计校园社区系统mybatis+源码+调试部署+系统+数据库+lw
    2023/10/15
  • 原文地址:https://blog.csdn.net/Bugxiu_fu/article/details/127096897