Layui文件上傳踩坑:
1.返回必須是json格式的問題
按照layui規定前后端數據格式保持json格式
解決方案:
1.controller層方法上加@ResponseBody
2.在controller層方法中將對象轉為json格式后返回,例如JSONObject.toJSONString(resObj);
2.跨域問題(CORS)
CORS,常被大家稱之為跨越問題,准確的叫法是跨域資源共享(CORS,Cross-origin resource sharing),是W3C標准,是一種機制,它使用額外的HTTP頭來告訴瀏覽器 讓運行在一個 origin (domain) 上的Web應用被准許訪問來自不同源服務器上的指定的資源。當一個資源從與該資源本身所在的服務器不同的域或端口請求一個資源時,資源會發起一個跨域 HTTP 請求。
例如 http://localhost:9000請求http://localhost:8761/eureka/apps就是違背了上述原則,即:請求服務器不同端口的另一個資源,出於安全原因,瀏覽器限制發起的跨源HTTP請求,例如,XMLHttpRequest和Fetch API遵循同源策略, 這意味着使用這些API的Web應用程序只能從加載應用程序的同一個域請求HTTP資源,除非使用CORS頭。跨域資源共享( CORS )機制允許 Web 應用服務器進行跨域訪問控制,從而使跨域數據傳輸得以安全進行。瀏覽器支持在 API 容器中(例如 XMLHttpRequest 或 Fetch )使用 CORS,以降低跨域 HTTP 請求所帶來的風險。
CORS標准新增了一組 HTTP 頭字段(Access-Control-Allow-Origin),允許服務器聲明哪些源通過瀏覽器有權限訪問哪些資源。另外,規范要求,對那些可能對服務器數據產生副作用的 HTTP 請求方法(特別是 GET以外的 HTTP 請求,或者搭配某些 MIME 類型的 POST請求),瀏覽器必須首先使用 OPTIONS 方法發起一個預檢請求(preflight request),從而獲知服務端是否允許該跨域請求。服務器確認允許之后,才發起實際的 HTTP 請求。在預檢請求的返回中,服務器端也可以通知客戶端,是否需要攜帶身份憑證(包括Cookies 和 HTTP 認證相關數據)。
解決辦法:
在本項目中添加如下過濾器:
/**
\* 解決跨域問題
*/
public class AccessControlAllowOriginFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Allow-Credentials", "true");
chain.doFilter(req, response);
}
public void init(FilterConfig filterConfig) {
}
public void destroy() {
}
}
注解方式
在Spring Boot中擁有大量的注解,針對跨域問題,也提供了對應的注解@CrossOrigin,使用方法如下:
import java.util.HashMap;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
\* @author xcbeyond
*/
@RestController
@RequestMapping(value = "/api", method = RequestMethod.POST)
public class DemoController {
@CrossOrigin(origins = "*")
@RequestMapping(value = "/get")
public String get() {
……
}
}