毕设遇到的一些问题(二)

同步到 Git / GitHub 上


https://zhuanlan.zhihu.com/p/656740010#/


spring-initializer 访问失败


换这个:
https://start.springboot.io


MySQL 10061


MySQL开机自启动设置(Windows)


npm install 卡住


运行npm install卡住不动的几种解决方案-CSDN博客,用的方法四,可以用,但是后面看人说用 cnpm 安装可能会有奇怪的问题,所以先用了下方法二,还是卡住发现是镜像的问题,之前配置的淘宝镜像用不了了,采用方法一的方法换成官方镜像之后,再直接 npm install 就好了!
Vue error:0308010C:digital envelope routines::unsupported
解决Vue 报错error:0308010C:digital envelope routines::unsupported,方法三!


形参化类 R 的原始使用


Raw use of parameterized class ‘xxxx‘ 警告-CSDN博客


不建议使用字段注入@Autowired(已解决)


spring系列之——使用@Autowired注解,不建议基于字段的依赖注入_基于字段的依赖注入的方式,基本都是private形式的-CSDN博客
 

设值注入


基于上面文章的 setter,如下:

@Controller
@RequestMapping("employee")
public class EmployeeController {
    
    private EmployeeMapper employeeMapper;
    
    @Autowired
    public void setEmployeeMapper(EmployeeMapper employeeMapper) {
        this.employeeMapper = employeeMapper;
    }
    
    // 我的代码
    private HistoryService historyService;
    private ShopServiceImp shopService;

    @Autowired
    public void setHistoryService(HistoryService historyService) {
        this.historyService = historyService;
    }
    @Autowired
    public void  setShopService(ShopServiceImp shopService) {
        this.shopService = shopService;
    }   
}

解释如下:

在你提供的代码片段中,@Autowired 注解被用于两个方法 setHistoryService 和 setShopService,这些方法用于手动设置类成员变量 historyService 和 shopService。这种用法在 Spring 框架中被称为构造器注入或设值注入(Setter 注入)。

构造器注入是指通过类的构造器来注入依赖项,而设值注入是指通过类的 setter 方法来注入依赖项。在你的例子中,使用的是设值注入。

这里发生了什么:

1@Autowired 注解告诉 Spring 容器,当创建 HistoryController 的实例时,应该使用 setHistoryService 和 setShopService 方法来注入 HistoryService 和 ShopServiceImp 的实例。
2Spring 容器会查找满足 HistoryService 和 ShopServiceImp 类型的 Bean,并尝试将它们作为参数调用 setHistoryService 和 setShopService 方法。
3成功调用这些方法后,historyService 和 shopService 成员变量就会被注入相应的 Bean 实例。

你的代码中没有显示使用构造器注入。


构造器注入


通常构造器注入是这样的:

@Controller
@RequestMapping("history")
public class HistoryController {
    private final HistoryService historyService;
    private final ShopServiceImp shopService;
    @Autowired
    public HistoryController(HistoryService historyService, ShopServiceImp shopService) {
        this.historyService = historyService;
        this.shopService = shopService;
    }
}


在这个例子中,@Autowired 注解被用于构造器 HistoryController,这意味着 Spring 容器会自动寻找满足 HistoryService 和 ShopServiceImp 类型的 Bean 并作为参数传递给构造器,从而实现依赖注入。 总之,无论是设值注入还是构造器注入,@Autowired 注解都是用来指示 Spring 容器进行自动依赖注入的。设值注入通过 setter 方法进行,而构造器注入通过构造器进行。在你的代码中,使用的是设值注入。总之,@Autowired 注解是用来指示 Spring 容器进行自动依赖注入的,你不需要手动调用 set 方法。Spring 容器会负责找到合适的 Bean 并将其注入到你的类中。

@RequiredArgsConstructor

@RequiredArgsConstructor 是 Lombok 库提供的一个注解,它可以自动为 Lombok 标记为 final 的字段生成构造函数。这样,你就不需要手动为每个字段提供构造函数,大大简化了代码。

当你使用 @Autowired 进行字段注入时,通常是因为你希望在一个类的构造函数中自动注入依赖。但是这种方式有时会导致一些问题,比如在构造函数中注入多个依赖时可能会出现异常。

使用 @RequiredArgsConstructor,你可以避免这些问题,同时使代码更加简洁。例如:

import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
@RequiredArgsConstructor
public class ShopServiceImp {
    private final ShopRepository shopRepository;
    private final ShopMapper shopMapper;
    // 其他方法
}



在上面的例子中,Lombok 会为 shopRepository 和 shopMapper 自动生成一个构造函数,这样你就不需要使用 @Autowired 了。

需要注意的是,@RequiredArgsConstructor 生成的构造函数只会为那些被标记为 final 的字段生成参数。所以,在上面的例子中,只有 shopRepository 和 shopMapper 被注入,而其他字段则不会。

最后,虽然 Lombok 和 Spring 支持这种做法,但建议在使用之前仔细阅读相关文档,以确保它满足你的需求,并了解可能存在的风险。
 

Vue

Vue项目结构


api - 这个目录通常用来存放所有与后端服务进行通信的API调用。例如,使用Axios或Fetch API来发送HTTP请求。
assets - 存放静态资源,如样式表、图片、字体等。
components - Vue组件的集合。组件是Vue的构建块,用于重用和模块化代码。
plugins - 存放项目中使用的Vue插件,用于扩展Vue的功能。5router - 路由配置目录,定义了用户导航时如何与不同的页面组件进行匹配。
store -Vuex状态管理仓库,用于管理应用的状态。
views - 存放不同的页面组件,通常与路由配置中的路径相对应。

Vue与后端交互的运行原理:

1-用户交互 - 用户与前端界面进行交互(例如点击按钮)。
2发送请求 - 前端通过api目录中的代码向后端发送请求(通常是HTTP请求)。
3后端处理 - 后端接收到请求后,进行处理(例如查询数据库、执行计算等)。
4返回响应 - 后端处理完成后,将响应数据返回给前端。
5前端更新 - 前端接收到响应后,根据数据更新用户界面。

当然可以。下面是一个简单的Vue.js项目示例,我将为你逐句解释代码。 首先,这是一个简单的Vue组件,它展示了一个计数器,用户可以通过点击按钮来增加或减少计数。

<template>
  <div id="app">
    <h1>{{ count }}</h1>
    <button @click="decrement">-</button>
    <button @click="increment">+</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      count: 0
    };
  },
  methods: {
    increment() {
      this.count++;
    },
    decrement() {
      this.count--;
    }
  }
};
</script>
<style>
/* 在这里添加CSS样式 */
</style>


逐句解释:

1<template> - 这标志着模板部分的开始,模板是Vue组件的HTML部分。
2<div id="app"> - 创建一个ID为"app"的<div>元素,这将是组件的根元素。
3<h1>{{ count }}</h1> - 创建一个<h1>元素,它会显示组件的数据属性count的值。
4<button @click="decrement">-</button> - 创建一个按钮,当点击时会调用名为decrement的方法,该方法会减少count的值。
5<button @click="increment">+</button> - 创建另一个按钮,当点击时会调用名为increment的方法,该方法会增加count的值。
6</div> - 结束<div>元素。
7</template> - 结束模板部分。
8<script> - 这标志着脚本部分的开始,脚本包含组件的JavaScript逻辑。
9export default { - 导出一个默认的Vue组件对象。
10data() { - 定义组件的数据函数,它返回一个对象,包含组件的响应式数据。
11return { - 返回一个对象,其中包含一个名为count的属性,初始值为0。
12}; - 结束数据函数。
13methods: { - 定义组件的方法对象,其中包含两个方法increment和decrement。
14increment() { - 定义increment方法,它通过this.count++增加count的值。
15} - 结束increment方法。
16decrement() { - 定义decrement方法,它通过this.count--减少count的值。
17} - 结束decrement方法。
18}; - 结束方法对象。
19</script> - 结束脚本部分。
20<style> - 这标志着样式表的开始,你可以在这里添加CSS样式。
21/* 在这里添加CSS样式 */ - 这是一个注释,提示你在这里添加CSS样式。
22</style> - 结束样式表。 这个示例展示了Vue组件的基本结构,包括模板、脚本和样式。组件是Vue.js应用的基础,你可以通过组合不同的组件来构建复杂的应用程序。
 

Spring 注解



@CrossOrigin 



@CrossOrigin 是一个 Spring 框架的注解,用于处理跨源请求。当你的应用程序部署在一个 Web 服务器上时,默认情况下,出于安全考虑,Web 服务器会阻止来自不同源(域名、协议或端口)的请求。这就是所谓的同源策略(Same-Origin Policy)。 然而,在开发 Restful API 时,你可能会希望允许来自不同源的客户端访问你的服务。这就是 @CrossOrigin 注解的作用所在。它可以被应用于控制器、请求映射方法或类上,以允许跨源请求。 以下是一些 @CrossOrigin 的使用示例:

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@CrossOrigin(origins = "http://example.com", maxAge = 3600)
@RestController
public class MyController {
    @CrossOrigin
    @GetMapping("/myResource")
    public String getMyResource() {
        return "Data from my resource";
    }
}



在上面的例子中,@CrossOrigin 注解被应用于类上,允许 http://example.com 的客户端访问 /myResource 路径。maxAge 属性指定了预检请求(preflight request)的最大缓存时间(以秒为单位)。 你还可以在 @CrossOrigin 注解中使用 allowedMethods、allowedHeaders 和 exposedHeaders 等属性来更详细地控制跨源请求。 需要注意的是,@CrossOrigin 注解并不会暴露任何安全漏洞,它只是允许跨源请求。应用程序的安全性仍然需要通过其他方式来确保,比如使用 Spring Security 或其他安全机制。此外,过度使用 @CrossOrigin 可能会导致安全问题,因此应该谨慎地应用它,并确保只有信任的客户端能够访问你的服务。



@RequestParam @RequestBody 



@RequestParam 注解在 Spring 和 Spring MVC 中主要用于处理 GET 请求中的参数。它从请求的 URL 中提取参数映射到控制器方法的参数上。通常,当你的请求是通过 URL 传递参数时,比如 http://example.com/resource?param1=value1&param2=value2,这时可以使用 @RequestParam 来获取这些参数。 对于 POST 请求,通常情况下,我们是将数据放在请求体(Request Body)中,而不是在 URL 中。POST 请求通常用于提交表单数据或者上传文件。对于 POST 请求中的数据,Spring MVC 提供了其他的注解来处理,如 @RequestBody。 @RequestBody 注解用于将 HTTP 请求的 body 部分解析并映射到 Java 对象上。这意味着,如果你的 POST 请求包含了 JSON 或 XML 格式的数据,你可以在控制器的方法中使用 @RequestBody 来获取这些数据。 下面是一个使用 @RequestBody 的例子:
 

@PostMapping("/resource")
public ResponseEntity<String> handlePostRequest(@RequestBody MyObject myObject) {
    // 处理 myObject,它包含了 POST 请求 body 中的数据
    return ResponseEntity.ok("Data processed successfully");
}


在这个例子中,MyObject 是一个 Java 对象,它映射了 POST 请求 body 中的 JSON 数据。 总结来说,@RequestParam 不适用于 POST 请求,因为 POST 请求的数据通常在请求体中,而不是在 URL 参数中。对于 POST 请求,应该使用 @RequestBody 注解来解析请求体中的数据。

●也就是说,@RequestParam会将参数值暴露在网址中,对吗?这是否会造成数据泄露?如何避免这种方式?

是的,@RequestParam 注解用于处理 URL 中的查询参数,这些参数会暴露在 URL 中。如果你的应用程序需要处理敏感信息,比如个人身份信息、密码等,将这些信息通过 URL 参数传递是不安全的,因为这可能导致数据泄露,尤其是在 URL 可能被记录或通过浏览器历史记录查看的情况下。 为了避免这种安全风险,你应该采用以下方法来处理敏感信息:

1使用 HTTPS:确保你的应用程序使用 HTTPS 来加密客户端和服务器之间的通信。这样即使 URL 被记录,敏感信息也会被加密,难以被截获和解读。
2不要在 URL 中传递敏感信息:避免在 URL 中传递敏感信息,比如使用 POST 请求而不是 GET 请求来传递敏感数据。
3使用 POST 请求和 @RequestBody  :对于需要传递复杂数据(如 JSON 或 XML)的情况,应该使用 POST 请求,并使用 @RequestBody 注解来处理请求体中的数据。由于请求体不会出现在 URL 中,因此可以避免敏感数据泄露。
4使用安全编码实践:在处理请求数据时,使用安全编码实践,比如验证和清理输入数据,以防止注入攻击和数据泄露。
5敏感数据加密:对于需要在应用程序内部处理的敏感数据,如密码、信用卡信息等,应该使用适当的加密方法进行加密存储和传输。
6最小权限原则:确保只有授权的用户才能访问包含敏感信息的资源,并且这些用户只有必要的权限来执行操作。
7使用安全框架和库:利用现有的安全框架和库,如 Spring Security,来帮助你处理安全问题,它们通常提供了用于保护应用程序的安全控制功能。



@RequestBody  的用法



在使用 SpringBoot 和 Vue.js 进行前后端分离开发时,通常会通过 JSON 格式进行数据的传输。以下是一个简单的例子,展示了如何在前端 Vue.js 和后端 SpringBoot 之间传输包含name和password属性的User对象。

后端(Spring Boot)

首先,我们需要在Spring Boot中创建一个控制器来接收前端发送的User对象。

import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api")
public class UserController {
    @PostMapping("/login")
    public String login(@RequestBody User user) {
        // 这里可以添加验证逻辑,例如检查用户名和密码是否匹配
        // 此处只是简单地返回一个字符串作为示例
        return "Login successful!";
    }
    public static class User {
        private String name;
        private String password;
        // getter和setter方法
    }
}


在这个控制器中,我们定义了一个@PostMapping注解的login方法,它使用@RequestBody注解来指示Spring Boot将HTTP请求体中的内容转换为User对象。User类定义了一个包含name和password属性的简单Java类,并省略了标准的getter和setter方法。

前端(Vue.js)

接下来,在Vue.js中,我们需要创建一个表单来发送包含用户名和密码的数据。

<template>
  <div>
    <form @submit.prevent="submitForm">
      <input v-model="user.name" type="text" placeholder="Username" />
      <input v-model="user.password" type="password" placeholder="Password" />
      <button type="submit">Login</button>
    </form>
  </div>
</template>
<script>
export default {
  data() {
    return {
      user: {
        name: '',
        password: ''
      }
    };
  },
  methods: {
    submitForm() {
      // 发送表单数据到后端
      this.$http.post('/api/login', this.user)
        .then(response => {
          // 处理响应
          console.log(response);
        })
        .catch(error => {
          // 处理错误
          console.error(error);
        });
    }
  }
};
</script>



在这个Vue.js组件中,我们创建了一个简单的表单,使用v-model指令来双向绑定输入框的数据到user对象。当表单提交时,submitForm方法会被调用,使用axios(或其他HTTP客户端)向后端发送一个POST请求,并将user对象作为请求体发送。 请注意,实际开发中需要对密码进行加密处理,并在后端进行相应的验证和安全检查。此示例仅用于演示目的,并未涵盖所有安全最佳实践。
 

@PathVariable 



使用@PathVariable而不是@RequestParam意味着您正在使用Spring框架中的路径变量而不是请求参数。路径变量通常用于捕获URL路径中的动态部分,而请求参数通常用于获取请求体或URL查询字符串中的参数。 如果您之前使用的是@RequestParam,那么您的URL可能看起来像这样:
 

GET /api/resource?param=value


而使用@PathVariable,您的URL可能看起来像这样:

GET /api/resource/{param}/value



在这里,{param}是一个路径变量,它会被Spring框架解析并注入到您的控制器方法中。 确保您在控制器方法中正确地使用了路径变量,并且在URL中也正确地使用了花括号 {} 来标识变量。如果您在URL中使用了路径变量但没有在控制器方法中正确地处理它们,那么就会导致参数传递失败。 例如,您的控制器方法可能看起来像这样:

@GetMapping("/api/resource/{param}/value")
public ResponseEntity<?> getResource(@PathVariable String param) {
    // 使用param变量
    return ResponseEntity.ok().body("Param value: " + param);
}



在使用路径变量时,确保您的URL匹配了控制器方法中定义的路径模式。如果您在URL中使用了错误的变量名或者没有提供必要的值,Spring框架将无法正确地解析路径变量,导致参数丢失。

@RequestParam 和 @PathVariable 都是 Spring MVC 中的注解,用于将请求中的数据映射到控制器方法的参数上。它们的主要区别在于数据来源和用途:

1@RequestParam:
○用于从 HTTP 请求的查询参数(Query Parameters)中获取数据。
○查询参数是附加在 URL 后的关键字值对,例如 http://example.com/resource?param1=value1&param2=value2。
○使用 @RequestParam 注解时,参数值会暴露在 URL 中,因此不适用于传递敏感信息。
2@PathVariable:
○用于从 HTTP 请求的 URI 模板中的变量中获取数据。
○URI 模板是 URL 的一部分,它们嵌入在资源的 URL 路径中,例如 http://example.com/resource/{param1}/{param2}。
○使用 @PathVariable 注解时,参数值也会暴露在 URL 中,因此也不适用于传递敏感信息。

无论是 @RequestParam 还是 @PathVariable,都不应该用于传递敏感信息,因为它们都会在 URL 中暴露参数值。对于传递敏感信息,应该使用 @RequestBody,它允许你从 HTTP 请求体中读取数据,这些数据不会出现在 URL 中,因此更安全。 总之,选择使用 @RequestParam、@PathVariable 还是 @RequestBody,取决于你需要从哪里获取数据以及数据的用途。对于不敏感的查询参数和路径变量,可以使用这些注解;对于敏感数据,应该使用 @RequestBody。同时,始终确保使用 HTTPS 来加密传输数据,并采取其他适当的安全措施来保护敏感信息。
 


AUTO_INCREAMENT,@Insert怎么插入?


在MyBatis中,使用@Insert注解来插入数据到数据库时,如果你的表中有自增字段(比如AUTO_INCREMENT),MyBatis会自动处理这个字段的值。你只需要指定其他你想要插入的列的值,自增字段会由数据库自动填充。 以下是一个使用@Insert注解插入数据到数据库的例子,其中id字段是自增的:

import org.apache.ibatis.annotations.Insert;
public interface UserMapper {
    @Insert("INSERT INTO user (name, email, create_time) VALUES(#{name}, #{email}, #{createTime})")
    void insertUser(User user);
}



在这个例子中,User类代表数据库中的user表。我们想要插入一个新用户,所以创建了一个User实例并设置了name、email和createTime属性。id字段没有被设置,因为它会是自增的。 当你调用insertUser方法时,MyBatis会生成一个SQL语句,类似于:

INSERT INTO user (name, email, create_time) VALUES('张三', 'zhangsan@example.com', CURRENT_TIMESTAMP)



在这个SQL语句中,CURRENT_TIMESTAMP是create_time列的默认值,这取决于你所使用的数据库。当你执行这个SQL时,数据库会自动为id字段分配一个唯一的值,而你不需要指定它。 确保你的MyBatis配置文件或者Spring Boot应用的配置中指定了数据源和事务管理器,这样MyBatis才能正确地与数据库交互。 在实际开发中,你可能还需要处理异常情况,比如当插入操作因为某些原因失败时。你可以在insertUser方法中抛出异常,然后在调用这个方法的地方进行异常处理。
 

上传图片



菜鸟的springboot项目图片上传及图片路径分析_springboot 图片默认在target/class下面找?-CSDN博客
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值