• 前后端分离


    前端特殊点:

     在前后端未分离时:

     

    前端页面:

    和jsp写法差不多,需要更改几处。

    编写登陆页面:

    和jsp一样,此处省略

    main文件配置

     

    后端

     使用代码生成器生成代码

    参见

    https://blog.csdn.net/weixin_43766390/article/details/125982048?spm=1001.2014.3001.5501icon-default.png?t=M666https://blog.csdn.net/weixin_43766390/article/details/125982048?spm=1001.2014.3001.5501

    添加一个与前端交互的包vo他和entity包一样,都是实体类,但vo是和前端交互用的,entity是和数据库交互用的

     

     定义一个登录类

    1. @RestController
    2. @RequestMapping(value = "/system")
    3. @Api(tags = "登录接口类")
    4. public class LoginCon {
    5. @Autowired
    6. IUserService userService;
    7. @ApiOperation(value = "登录接口方法")
    8. @PostMapping(value = "/login")
    9. public CommonResult login(@RequestBody LoginVo loginVo){
    10. System.out.println(loginVo);
    11. QueryWrapper wrapper = new QueryWrapper<>();
    12. wrapper.eq("username",loginVo.getUid());
    13. wrapper.eq("password",loginVo.getUpwd());
    14. wrapper.eq("is_deleted",0);
    15. User one = userService.getOne(wrapper);
    16. if(one != null){
    17. return new CommonResult(2000,"登录成功",null);
    18. }else {
    19. return new CommonResult(5000,"登陆失败",null);
    20. }
    21. }
    22. }

    使用代码生成器生成代码

    代码生成器使用参照

    https://blog.csdn.net/weixin_43766390/article/details/125982048?spm=1001.2014.3001.5501icon-default.png?t=M666https://blog.csdn.net/weixin_43766390/article/details/125982048?spm=1001.2014.3001.5501

    修改前端代码;

     

    登陆测试报错:跨域问题

    当使用异步请求从一个网址访问另一个网址时可能会出现跨域问题。
    前提:
       1. 必须为异步请求
       2. 当端口号或协议或ip不同时则会出现跨域

     解决问题

    1.前端解决
    2.后端解决---->这里也有几种方式:
       【1】可以借助nginx.
       【2】在代码中解决 

    这里介绍后端解决方案

    第一种加注解

    在控制层需要的接口上添加@CrossOrigin  

     

    @CrossOrigin  

    属性:

    origins = {"192.168.0.111:8080","192.168.0.120:8081"},allowedHeaders="运行哪些请求头跨域",methods={"GET","POST"})

    origins: 允许哪些域可以跨域访问我这个接口
    allowedHeaders:允许哪些请求头信息跨域
    methods: 允许哪些请求方式跨域

     请求类型

    用法

     

     

    第二种(推荐)

    如果使用注解,拿需要在所有接口上都加,工作量很大。

    使用全局跨域配置类  的话只需配置一次

    1. import org.springframework.context.annotation.Bean;
    2. import org.springframework.context.annotation.Configuration;
    3. import org.springframework.web.cors.CorsConfiguration;
    4. import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
    5. import org.springframework.web.filter.CorsFilter;
    6. @Configuration
    7. public class CorsConfig {
    8. // 当前跨域请求最大有效时长。这里默认1天
    9. private static final long MAX_AGE = 24 * 60 * 60;
    10. @Bean
    11. public CorsFilter corsFilter() {
    12. UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    13. CorsConfiguration corsConfiguration = new CorsConfiguration();
    14. corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址
    15. corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头
    16. corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法
    17. corsConfiguration.setMaxAge(MAX_AGE);
    18. source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置
    19. return new CorsFilter(source);
    20. }
    21. }

     修该登录页面进行路由跳转

     

     

    上面写的登录,后端没有保存数据 前端也没有拿到数据进行保存.

    解决方案 

    在登录接口,随机生成一个字符串token,而且唯一不重复,把token作为redis的key,把用户信息
    作为value,存入到redis中,然后把token放入common Result的data上;

    这样前端就拿到了token,

    当需要查询权限时,将token传给后端,后端根据token查redis取到用户信息,再查询。

    利用redis保存用户数据

    添加redis依赖

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-data-redisartifactId>
    4. dependency>

    添加配置 

     修改登陆接口

     

     

    1. @RestController
    2. @RequestMapping(value = "/system")
    3. @Api(tags = "登录接口类")
    4. public class LoginCon {
    5. @Autowired
    6. IUserService userService;
    7. @Autowired
    8. private RedisTemplate redisTemplate;
    9. @ApiOperation(value = "登录接口方法")
    10. @PostMapping(value = "/login")
    11. public CommonResult login(@RequestBody LoginVo loginVo){
    12. System.out.println(loginVo);
    13. QueryWrapper wrapper = new QueryWrapper<>();
    14. wrapper.eq("username",loginVo.getUid());
    15. wrapper.eq("password",loginVo.getUpwd());
    16. wrapper.eq("is_deleted",0);
    17. User one = userService.getOne(wrapper);
    18. if(one != null){
    19. //随机生成一个唯一字符串。
    20. String token = UUID.randomUUID().toString();
    21. //把该token作为redis的key value为当前登录用户信息
    22. ValueOperations forValue = redisTemplate.opsForValue();
    23. /*存值,并设置有效时间*/
    24. forValue.set(token,one,24, TimeUnit.HOURS);
    25. return new CommonResult(2000,"登录成功",token);
    26. }else {
    27. return new CommonResult(5000,"登陆失败",null);
    28. }
    29. }
    30. }

    修改vue页面

    sessionStorage它相当于session

     测试

     

     

    连接redis数据库

    查看是否有值

     

    虽然问题解决,但这种方式有多少个接口就需要传token多少次耗费资源

     使用axios的请求拦截器

    上面的方式不完美,这里使用另一种方式。使用axios的请求拦截器,在请求头上添加token。

    添加配置类:

    1. /*设置axios请求拦截器,在请求头上添加token*/
    2. axios.interceptors.request.use(config=>{
    3. /*从session获取token值*/
    4. var token = sessionStorage.getItem("token");
    5. /*token为空是假,不为空为真*/
    6. if(token){
    7. /*在请求头上携带token*/
    8. config.headers.token=token;
    9. }
    10. return config;
    11. });

     

    添加测试页面

     

    结果获取到了:

     

     

     

     

     

  • 相关阅读:
    自动驾驶项目 ASLAN
    一种家用负荷的非侵入式识别方法研究
    算法与数据结构-AC自动机
    java计算机毕业设计瀚绅睿茨二人二轮车租赁管理源码+mysql数据库+系统+lw文档+部署
    实施 DevSecOps 最佳实践
    Femas:云原生多运行时微服务框架
    Angular实现日期,数据和更新
    Mall电商实战项目全面升级!支持最新版SpringBoot,干掉循环依赖...
    商城小程序代客下单程序开发演示
    python5
  • 原文地址:https://blog.csdn.net/weixin_43766390/article/details/126228074