## 四、SpringMVC注解 #### 4、`@RequestHeader` ##### 获取请求头信息 通过在参数前面添加`@RequestHeader('请求头key')`注解,请求头对应的value会自动注入到参数中。 ```java @RequestMapping("/hello") @ResponseBody public String helloGet(@RequestHeader("Host") String host, @RequestHeader("Accept") String accept) { return "Host:" + host + "; Accept:" + accept; } ``` ## 五、使用Servlet #### 1、添加Servlet依赖 ```xml jakarta.servlet jakarta.servlet-api 6.2.0-M1 provided ``` **注意**:若是高版本的SpringMVC就要添加`jakarta`的servlet,低版本的需要添加`javax`的servlet #### 2、通过Servlet获取请求头 ```java @RequestMapping("/hello") @ResponseBody public String helloGet(HttpServletRequest request) { return request.getHeader("host"); } ``` #### 3、设置响应头 ```java @RequestMapping("/hello") @ResponseBody public String helloGet(@RequestParam("name") String name,HttpServletResponse response) { response.setHeader("Name",name); return "success"; } ``` #### 4、乱码处理 ```java response.setContentType("text/html;charset=utf-8"); ``` #### 5、请求转发 一次请求一次响应,不会改变客户端的URL地址,转发的访问方式会传递到转发的地址上。 重定向与转发本质上都是转跳到新的URL路径  ```java @RequestMapping("/forward") public String testForward(){ return "forward:restful/test/1/n"; } ``` **注意**:可以直接使用中文参数进行转发 转发到接口方法 ```java @RequestMapping("/forward") public ModelAndView testForward(ModelAndView modelAndView){ modelAndView.addObject("name","张三"); modelAndView.addObject("age","18"); modelAndView.addObject("sex","男"); modelAndView.setViewName("forward:[方法名]"); return modelAndView; } ``` #### 6、请求重定向 两次请求两次响应,会改变客户端的URL地址 重定向与转发的区别是:重定向是一个客户端的行为,转发是服务端的行为  ```java @RequestMapping("/redirect") public String testRedirect(){ return "redirect:restful/test/1/n"; } ``` **注意**:重定向时不能添加`@ResponseBody`注解,且需要返回`redirect:重定向地址`字符串,重定向字符串中不能包含中文等特殊字符。 若要实现中文重定向则需要使用`RedirectAttributes` ```java @RequestMapping("/redirect") public String testRedirect(RedirectAttributes redirectAttributes){ redirectAttributes.addAttribute("name","张三"); redirectAttributes.addAttribute("age","18"); redirectAttributes.addAttribute("sex","男"); return "redirect:restful/{name}/{age}/{sex}"; } ``` 重定向到接口方法 ```java @RequestMapping("/redirect") public ModelAndView testRedirect(ModelAndView modelAndView){ modelAndView.addObject("name","张三"); modelAndView.addObject("age","18"); modelAndView.addObject("sex","男"); modelAndView.setViewName("redirect:[方法名]"); return modelAndView; } ``` #### 7、请求包含 将当前请求结果与请求信息一起转发到另一个方法 ## 六、会话跟踪 #### 1、Cookie Cookie是客户端的会话跟踪技术,是由服务端生成并存到客户端磁盘中。 ##### 设置Cookie ```java @RequestMapping("/cookie-set") @ResponseBody public String cookieSet(HttpServletResponse response) { // 创建一个Cookie对象 Cookie cookie = new Cookie("name","zhangsan"); // 设置Cookie有效期 cookie.setMaxAge(300); // 响应添加Cookie response.addCookie(cookie); return "success"; } ``` ##### 获取Cookie ```java @RequestMapping("/cookie-get") @ResponseBody public String cookieGet(HttpServletRequest request) { Cookie[] cookies = request.getCookies(); if (cookies != null){ for (Cookie cookie : cookies){ if(cookie.getValue().equals("zhangsan")) return "Hello,zhangsan"; } } return "success"; } ``` #### 2、Session 使用`HttpSession session = request.getSession();`来获取或创建一个Session 使用Session维护一个会话的登陆状态: * 当第一次请求时,在服务器端创建一个Session对象,并且为此对象生成一个sessionId。 * 同时,使用Cookie将此sessionId返回给客户端,并存储在客户端的Cookie中。 * 当客户端发起下一次请求时,必须携带此sessionId发送给服务器端。 * 服务器端根据接收的sessionId,就能找回Session对象,从而获取了上一次请求的信息。 ##### 设置Session内容 ```java @RequestMapping("/session-set") @ResponseBody public String sessionSet(HttpServletRequest request, HttpServletResponse response) { HttpSession session = request.getSession(); session.setAttribute("name", "zhangsan"); return session.getId(); } ``` ##### 获取Session内容 ```java @RequestMapping("/session-get") @ResponseBody public String sessionGet(HttpServletRequest request, HttpServletResponse response) { HttpSession session = request.getSession(); return session.getId() + ", name:" + session.getAttribute("name"); } ``` **注意**:在SpringMVC中可以直接注入Session对象 ```java @RequestMapping("/session-get") @ResponseBody public String sessionGet(HttpSession session) { return session.getId() + ", name:" + session.getAttribute("name"); } ``` ##### 修改Session有效期 需要在`web.xml`文件中添加 ```xml 30 ``` ## 七、Json转化 #### 1、导入依赖 ```xml com.fasterxml.jackson.core jackson-core 2.19.2 com.fasterxml.jackson.core jackson-databind 2.19.2 com.fasterxml.jackson.core jackson-annotations 2.19.2 ``` #### 2、响应Json 直接将方法的返回值改为对象即可将对象转化为Json格式 ```java @RequestMapping("/session-set") @ResponseBody public String sessionSet(HttpSession session) { User user = new User("张三",18,"男"); session.setAttribute("user", user); return session.getId(); } @RequestMapping("/session-get") @ResponseBody public User sessionGet(HttpSession session,HttpServletResponse response) { return (User) session.getAttribute("user"); } @RequestMapping("/list-get") @ResponseBody public List listGet(HttpSession session, HttpServletResponse response) { List list = new ArrayList<>(); list.add(new User("张三",18,"男")); list.add(new User("李四",19,"男")); list.add(new User("王五",20,"男")); list.add(new User("赵六",21,"男")); return list; } ``` #### 3、Json请求 在处理用Json发过来的Post请求时,参数前需要添加`@RequestBody`注解,且参数必须用对象形式来承接 ```java @PostMapping(value = "/json-test") @ResponseBody public User test(@RequestBody User user) { return user; } ``` ## 八、RestFul请求风格 目的是同一个链接通过不同的方法请求去执行不同的数据库操作 #### 1、约定 - GET --> (SELECT):从服务器查询,可以在服务器通过请求的参数区分查询的方式。 - POST --> (CREATE):在服务器端新建一个资源,调用insert操作。 - PUT --> (UPDATE):在服务器端更新资源,调用update操作。 - DELETE --> (DELETE):从服务器端删除资源,调用delete语句。 #### 2、使用 ```java @GetMapping(value = "/restful/{name}/{age}/{sex}") @ResponseBody public User testRestful1(@PathVariable("name") String name, @PathVariable("age") int age, @PathVariable("sex") String sex) { return new User("获取:"+name, age, sex); } @PostMapping("/restful/{name}/{age}/{sex}") @ResponseBody public User testRestful2(@PathVariable("name") String name, @PathVariable("age") int age, @PathVariable("sex") String sex) { return new User("新增:"+name, age, sex); } @PutMapping("/restful/{name}/{age}/{sex}") @ResponseBody public User testRestful3(@PathVariable("name") String name, @PathVariable("age") int age, @PathVariable("sex") String sex) { return new User("更新:"+name, age, sex); } @PatchMapping("/restful/{name}/{age}/{sex}") @ResponseBody public User testRestful4(@PathVariable("name") String name, @PathVariable("age") int age, @PathVariable("sex") String sex) { return new User("更新:"+name, age, sex); } @DeleteMapping("/restful/{name}/{age}/{sex}") @ResponseBody public User testRestful5(@PathVariable("name") String name, @PathVariable("age") int age, @PathVariable("sex") String sex) { return new User("删除:"+name, age, sex); } ``` ## 九、拦截器 拦截器可以在收到请求之后处理请求之前进行对请求数据合法性校验 实现类: * `HandlerInterceptor`接口 * preHanle:在进入controller之前进行拦截,返回值为true(放行)/false * postHandle:在进入controller之后进行拦截 * afterCompletion:在controller运行之后,视图运行之前进行拦截 #### 1、自定义拦截器类 创建`cn.doooog.springmvc.interceptor/MyInterceptor.java` ```java package cn.doooog.springmvc.interceptor; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.jspecify.annotations.Nullable; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { System.out.println("postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { System.out.println("afterCompletion"); } } ``` #### 2、添加到配置文件 ##### 拦截所有请求 ```xml ``` ##### 拦截指定路径请求 路径可以使用通配符,`/*`相当于拦截一级的请求,比如`/ctrl01/*`拦截`/ctrl01`下的请求,但不会拦截`/ctrl01/test/`下的,`/**`相当于拦截多级的请求 ```html ``` ##### 不拦截指定路径请求 通过``筛选出当前拦截路径下的不拦截的路径 ```html ``` ## 十、文件上传 #### 1、添加依赖 ```xml org.apache.commons commons-fileupload2-jakarta-servlet6 2.0.0-M4 commons-io commons-io 2.20.0 ``` #### 2、配置最大上传限制 修改`web.xml`文件中的`SpringMVC servlet设置` ```xml springMvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath*:SpringMVC.xml 1 10485760 10485760 0 ``` #### 3、添加上传文件解析器配置 在`SpringMVC.xml`文件的``中添加 ```xml ``` #### 4、编写前端上传页面 创建`fileupload.jsp` ```html <%@ page contentType="text/html;charset=UTF-8" language="java" %> Title ``` #### 5、编写后端控制器 创建`controller/FileController.java` ```java package cn.doooog.springmvc.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.util.UUID; @Controller @RequestMapping("/upload") public class FileController { @PostMapping("/file") @ResponseBody public String uploadFile(@RequestBody @RequestParam("file") MultipartFile file) { String path = "D:/upload"; String fileName = file.getOriginalFilename(); String newFileName; if (fileName != null) { newFileName = UUID.randomUUID() + fileName.substring(fileName.lastIndexOf(".")); File file1 = new File(path, newFileName); if (!file1.exists()){ file1.mkdirs(); } try { file.transferTo(file1); System.out.println(file1); } catch (IOException e) { System.out.println(e.getMessage()); } } return "ok"; } } ``` ## 十一、跨域问题解决 #### 1、服务端设置 ```java // 设置跨域时允许发送Cookie response.setHeader("Access-Control-Allow-Credentials", "true"); // 设置允许127.0.0.1:8080跨域访问 response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8080"); ``` #### 2、前端设置 ```javascript axios.defaults.withCredentails = true; ``` Loading... ## 四、SpringMVC注解 #### 4、`@RequestHeader` ##### 获取请求头信息 通过在参数前面添加`@RequestHeader('请求头key')`注解,请求头对应的value会自动注入到参数中。 ```java @RequestMapping("/hello") @ResponseBody public String helloGet(@RequestHeader("Host") String host, @RequestHeader("Accept") String accept) { return "Host:" + host + "; Accept:" + accept; } ``` ## 五、使用Servlet #### 1、添加Servlet依赖 ```xml <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.2.0-M1</version> <scope>provided</scope> </dependency> ``` **注意**:若是高版本的SpringMVC就要添加`jakarta`的servlet,低版本的需要添加`javax`的servlet #### 2、通过Servlet获取请求头 ```java @RequestMapping("/hello") @ResponseBody public String helloGet(HttpServletRequest request) { return request.getHeader("host"); } ``` #### 3、设置响应头 ```java @RequestMapping("/hello") @ResponseBody public String helloGet(@RequestParam("name") String name,HttpServletResponse response) { response.setHeader("Name",name); return "success"; } ``` #### 4、乱码处理 ```java response.setContentType("text/html;charset=utf-8"); ``` #### 5、请求转发 一次请求一次响应,不会改变客户端的URL地址,转发的访问方式会传递到转发的地址上。 重定向与转发本质上都是转跳到新的URL路径  ```java @RequestMapping("/forward") public String testForward(){ return "forward:restful/test/1/n"; } ``` **注意**:可以直接使用中文参数进行转发 转发到接口方法 ```java @RequestMapping("/forward") public ModelAndView testForward(ModelAndView modelAndView){ modelAndView.addObject("name","张三"); modelAndView.addObject("age","18"); modelAndView.addObject("sex","男"); modelAndView.setViewName("forward:[方法名]"); return modelAndView; } ``` #### 6、请求重定向 两次请求两次响应,会改变客户端的URL地址 重定向与转发的区别是:重定向是一个客户端的行为,转发是服务端的行为  ```java @RequestMapping("/redirect") public String testRedirect(){ return "redirect:restful/test/1/n"; } ``` **注意**:重定向时不能添加`@ResponseBody`注解,且需要返回`redirect:重定向地址`字符串,重定向字符串中不能包含中文等特殊字符。 若要实现中文重定向则需要使用`RedirectAttributes` ```java @RequestMapping("/redirect") public String testRedirect(RedirectAttributes redirectAttributes){ redirectAttributes.addAttribute("name","张三"); redirectAttributes.addAttribute("age","18"); redirectAttributes.addAttribute("sex","男"); return "redirect:restful/{name}/{age}/{sex}"; } ``` 重定向到接口方法 ```java @RequestMapping("/redirect") public ModelAndView testRedirect(ModelAndView modelAndView){ modelAndView.addObject("name","张三"); modelAndView.addObject("age","18"); modelAndView.addObject("sex","男"); modelAndView.setViewName("redirect:[方法名]"); return modelAndView; } ``` #### 7、请求包含 将当前请求结果与请求信息一起转发到另一个方法 ## 六、会话跟踪 #### 1、Cookie Cookie是客户端的会话跟踪技术,是由服务端生成并存到客户端磁盘中。 ##### 设置Cookie ```java @RequestMapping("/cookie-set") @ResponseBody public String cookieSet(HttpServletResponse response) { // 创建一个Cookie对象 Cookie cookie = new Cookie("name","zhangsan"); // 设置Cookie有效期 cookie.setMaxAge(300); // 响应添加Cookie response.addCookie(cookie); return "success"; } ``` ##### 获取Cookie ```java @RequestMapping("/cookie-get") @ResponseBody public String cookieGet(HttpServletRequest request) { Cookie[] cookies = request.getCookies(); if (cookies != null){ for (Cookie cookie : cookies){ if(cookie.getValue().equals("zhangsan")) return "Hello,zhangsan"; } } return "success"; } ``` #### 2、Session 使用`HttpSession session = request.getSession();`来获取或创建一个Session 使用Session维护一个会话的登陆状态: * 当第一次请求时,在服务器端创建一个Session对象,并且为此对象生成一个sessionId。 * 同时,使用Cookie将此sessionId返回给客户端,并存储在客户端的Cookie中。 * 当客户端发起下一次请求时,必须携带此sessionId发送给服务器端。 * 服务器端根据接收的sessionId,就能找回Session对象,从而获取了上一次请求的信息。 ##### 设置Session内容 ```java @RequestMapping("/session-set") @ResponseBody public String sessionSet(HttpServletRequest request, HttpServletResponse response) { HttpSession session = request.getSession(); session.setAttribute("name", "zhangsan"); return session.getId(); } ``` ##### 获取Session内容 ```java @RequestMapping("/session-get") @ResponseBody public String sessionGet(HttpServletRequest request, HttpServletResponse response) { HttpSession session = request.getSession(); return session.getId() + ", name:" + session.getAttribute("name"); } ``` **注意**:在SpringMVC中可以直接注入Session对象 ```java @RequestMapping("/session-get") @ResponseBody public String sessionGet(HttpSession session) { return session.getId() + ", name:" + session.getAttribute("name"); } ``` ##### 修改Session有效期 需要在`web.xml`文件中添加 ```xml <session-config> <!-- 单位是分钟 --> <session-timeout>30</session-timeout> </session-config> ``` ## 七、Json转化 #### 1、导入依赖 ```xml <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.19.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.19.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.19.2</version> </dependency> ``` #### 2、响应Json 直接将方法的返回值改为对象即可将对象转化为Json格式 ```java @RequestMapping("/session-set") @ResponseBody public String sessionSet(HttpSession session) { User user = new User("张三",18,"男"); session.setAttribute("user", user); return session.getId(); } @RequestMapping("/session-get") @ResponseBody public User sessionGet(HttpSession session,HttpServletResponse response) { return (User) session.getAttribute("user"); } @RequestMapping("/list-get") @ResponseBody public List<User> listGet(HttpSession session, HttpServletResponse response) { List<User> list = new ArrayList<>(); list.add(new User("张三",18,"男")); list.add(new User("李四",19,"男")); list.add(new User("王五",20,"男")); list.add(new User("赵六",21,"男")); return list; } ``` #### 3、Json请求 在处理用Json发过来的Post请求时,参数前需要添加`@RequestBody`注解,且参数必须用对象形式来承接 ```java @PostMapping(value = "/json-test") @ResponseBody public User test(@RequestBody User user) { return user; } ``` ## 八、RestFul请求风格 目的是同一个链接通过不同的方法请求去执行不同的数据库操作 #### 1、约定 - GET --> (SELECT):从服务器查询,可以在服务器通过请求的参数区分查询的方式。 - POST --> (CREATE):在服务器端新建一个资源,调用insert操作。 - PUT --> (UPDATE):在服务器端更新资源,调用update操作。 - DELETE --> (DELETE):从服务器端删除资源,调用delete语句。 #### 2、使用 ```java @GetMapping(value = "/restful/{name}/{age}/{sex}") @ResponseBody public User testRestful1(@PathVariable("name") String name, @PathVariable("age") int age, @PathVariable("sex") String sex) { return new User("获取:"+name, age, sex); } @PostMapping("/restful/{name}/{age}/{sex}") @ResponseBody public User testRestful2(@PathVariable("name") String name, @PathVariable("age") int age, @PathVariable("sex") String sex) { return new User("新增:"+name, age, sex); } @PutMapping("/restful/{name}/{age}/{sex}") @ResponseBody public User testRestful3(@PathVariable("name") String name, @PathVariable("age") int age, @PathVariable("sex") String sex) { return new User("更新:"+name, age, sex); } @PatchMapping("/restful/{name}/{age}/{sex}") @ResponseBody public User testRestful4(@PathVariable("name") String name, @PathVariable("age") int age, @PathVariable("sex") String sex) { return new User("更新:"+name, age, sex); } @DeleteMapping("/restful/{name}/{age}/{sex}") @ResponseBody public User testRestful5(@PathVariable("name") String name, @PathVariable("age") int age, @PathVariable("sex") String sex) { return new User("删除:"+name, age, sex); } ``` ## 九、拦截器 拦截器可以在收到请求之后处理请求之前进行对请求数据合法性校验 实现类: * `HandlerInterceptor`接口 * preHanle:在进入controller之前进行拦截,返回值为true(放行)/false * postHandle:在进入controller之后进行拦截 * afterCompletion:在controller运行之后,视图运行之前进行拦截 #### 1、自定义拦截器类 创建`cn.doooog.springmvc.interceptor/MyInterceptor.java` ```java package cn.doooog.springmvc.interceptor; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.jspecify.annotations.Nullable; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { System.out.println("postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { System.out.println("afterCompletion"); } } ``` #### 2、添加到配置文件 ##### 拦截所有请求 ```xml <mvc:interceptors> <bean class="cn.doooog.springmvc.interceptor.MyInterceptor"/> </mvc:interceptors> ``` ##### 拦截指定路径请求 路径可以使用通配符,`/*`相当于拦截一级的请求,比如`/ctrl01/*`拦截`/ctrl01`下的请求,但不会拦截`/ctrl01/test/`下的,`/**`相当于拦截多级的请求 ```html <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/ctrl01/forward"/> <bean class="cn.doooog.springmvc.interceptor.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors> ``` ##### 不拦截指定路径请求 通过`<mvc:exclude-mapping>`筛选出当前拦截路径下的不拦截的路径 ```html <mvc:interceptor> <mvc:mapping path="/ctrl01/**"/> <mvc:exclude-mapping path="/ctrl01/forward"/> <bean class="cn.doooog.springmvc.interceptor.MyInterceptor"/> </mvc:interceptor> ``` ## 十、文件上传 #### 1、添加依赖 ```xml <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-fileupload2-jakarta-servlet6 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-fileupload2-jakarta-servlet6</artifactId> <version>2.0.0-M4</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.20.0</version> </dependency> ``` #### 2、配置最大上传限制 修改`web.xml`文件中的`SpringMVC servlet设置` ```xml <!-- servlet请求分发器 --> <servlet> <servlet-name>springMvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--配置文件设置--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:SpringMVC.xml</param-value> </init-param> <!-- 表示启动容器时初始化该Servlet --> <load-on-startup>1</load-on-startup> <multipart-config> <max-file-size>10485760</max-file-size> <!-- 单个文件最大10MB --> <max-request-size>10485760</max-request-size> <!-- 请求总大小最大10MB --> <file-size-threshold>0</file-size-threshold> </multipart-config> </servlet> ``` #### 3、添加上传文件解析器配置 在`SpringMVC.xml`文件的`<beans>`中添加 ```xml <!--上传文件解析器配置--> <bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/> ``` #### 4、编写前端上传页面 创建`fileupload.jsp` ```html <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form action="./upload/file" method="post" enctype="multipart/form-data"> <input type="file" name="file"><br> <input type="submit" value="提交"> </form> </body> </html> ``` #### 5、编写后端控制器 创建`controller/FileController.java` ```java package cn.doooog.springmvc.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.util.UUID; @Controller @RequestMapping("/upload") public class FileController { @PostMapping("/file") @ResponseBody public String uploadFile(@RequestBody @RequestParam("file") MultipartFile file) { String path = "D:/upload"; String fileName = file.getOriginalFilename(); String newFileName; if (fileName != null) { newFileName = UUID.randomUUID() + fileName.substring(fileName.lastIndexOf(".")); File file1 = new File(path, newFileName); if (!file1.exists()){ file1.mkdirs(); } try { file.transferTo(file1); System.out.println(file1); } catch (IOException e) { System.out.println(e.getMessage()); } } return "ok"; } } ``` ## 十一、跨域问题解决 #### 1、服务端设置 ```java // 设置跨域时允许发送Cookie response.setHeader("Access-Control-Allow-Credentials", "true"); // 设置允许127.0.0.1:8080跨域访问 response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8080"); ``` #### 2、前端设置 ```javascript axios.defaults.withCredentails = true; ``` 最后修改:2025 年 11 月 03 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 👆请简单粗暴地爱我。