一、Springboot跨域註解概述
隨著前端和後端分離越來越流行,跨域(Cross-Origin Resource Sharing,簡稱CORS)問題越來越普遍。當瀏覽器執行跨域請求時,會遵循同源策略來限制跨域請求。Springboot提供了很多解決跨域請求的方法,其中比較簡單和實用的就是使用跨域註解。本文將詳細介紹Springboot跨域註解及相關問題。
二、Springboot跨域註解使用方法
1、在需要允許跨域的Controller上使用@CrossOrigin註解。@CrossOrigin註解支持四個參數,分別是value、methods、allowedHeaders和maxAge。例如:
@RestController
@RequestMapping("/api")
public class UserController {
@CrossOrigin(value = "*", maxAge = 1800, allowedHeaders = "*")
@GetMapping("/users")
public List getUserList() {
//...
}
}
2、在Springboot應用的配置文件中使用CorsFilter。例如:
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("*");
config.addAllowedMethod("*");
config.addAllowedHeader("*");
config.setMaxAge(1800L);
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
需要注意的是,使用CorsFilter需要添加依賴:spring-boot-starter-web、spring-boot-starter-tomcat、spring-boot-starter-validation。
三、Springboot跨域註解常見問題
1、Springboot跨域註解 vue無效
由於Vue的CORS請求默認會發送一個options的preflight請求,所以我們需要在服務端處理OPTIONS請求並添加相應的響應頭信息。例如:
@RestController
public class CorsController {
@RequestMapping("/api/**")
public void cors(HttpServletRequest request, HttpServletResponse response) {
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
response.setHeader("Access-Control-Allow-Headers", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Max-Age", "3600");
}
}
2、Springboot跨域註解無效
在某些情況下,部署Springboot應用時,可能會發現@CrossOrigin註解無效。這時,我們可以嘗試添加一個過濾器來處理跨域問題。例如:
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
response.setHeader("Access-Control-Allow-Headers", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Max-Age", "3600");
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
} else {
chain.doFilter(req, res);
}
}
}
3、Springboot跨域註解指定IP
如果只允許特定的IP進行跨域請求,我們可以在@CrossOrigin註解中指定allowedOrigins參數。例如:
@RestController
@RequestMapping("/api")
public class UserController {
@CrossOrigin(allowedOrigins = {"http://127.0.0.1:8080"})
@GetMapping("/users")
public List getUserList() {
//...
}
}
四、Springboot核心註解
除了@CrossOrigin註解外,Springboot還提供了很多核心註解,如@Controller、@RestController、@Autowired等。下面介紹三個比較常用的核心註解。
1、@Controller和@RequestMapping
@Controller註解用於標識一個類為Spring MVC的Controller,@RequestMapping則用於映射URL請求路徑。例如:
@Controller
@RequestMapping("/api")
public class UserController {
@GetMapping("/users")
public List getUserList() {
//...
}
}
2、@RestController和@GetMapping
@RestController註解不僅包含@Controller註解的功能,還可以自動添加@ResponseBody註解。@GetMapping則是@GetMapping註解的縮寫,用於處理HTTP GET請求。例如:
@RestController
@RequestMapping("/api")
public class UserController {
@GetMapping("/users")
public List getUserList() {
//...
}
}
3、@Autowired和@Service
@Autowired註解可以自動注入一個Bean,@Service註解則用於標識一個類為Spring的Service。例如:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public List getUserList() {
return userRepository.findAll();
}
}
五、Springboot註解有哪些
除了上面介紹的註解外,Springboot還提供了很多其他的註解,如@Bean、@Configuration、@Component等。這些註解讓Springboot的配置和開發變得更加簡單和方便。
六、Springboot面試題及答案
1、什麼是Springboot?
答:Springboot是一種基於Spring框架的快速開發、便於部署的JavaWeb框架。
2、Springboot的特點有哪些?
答:Springboot的特點包括:快速開發、輕量級、依賴管理、自動配置、無XML配置、內嵌Servlet容器和獨立性。
3、如何使用Springboot處理跨域請求?
答:Springboot可以通過使用@CrossOrigin註解和CorsFilter來處理跨域請求。
4、Springboot中常用的註解有哪些?
答:Springboot中常用的註解包括:@Controller、@RestController、@Autowired、@Service、@Repository、@Bean、@Configuration、@Component等。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/219723.html
微信掃一掃
支付寶掃一掃