java最优雅的跨域配置
JAVA最优雅的解决跨域问题
简介
现在很多企业开发都是微服务开发平台,手机APP开发、微信开发、微信小程序开发等等后台开发可以用php、java、.netcore、python等等,不过每种语言的开发基本上都会遇到一个共同的问题跨域问题。今天我们看一下java微服务框架SpringBoot如何优雅的配置跨域问题。下面我们来直接看代码。其实配置很简单,主要是为了能够直接上手利用复制到代码中,不影响现实业务代码的开发进度。有三钟方法下面我们看一下。
文章目录
01 过滤器进行全局配置统一跨域配置方法
使用过滤器和拦截器方法来统一配置跨域请求在我看来都差不多的性能,方便的地方是在这一个方法统一配置之后,就可以方便的使用后台方法了,但是也有个缺点,如果你不是设置为私有的方法,在controller里能够看到的代码在服务器外部都可以被访问到。不过如果进行jwt配置也可以做到安全控制访问。
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; /** * 跨域请求处理 * @author l * */ @Configuration public class CrosConfig { private CorsConfiguration buildConfig() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); // 1 corsConfiguration.addAllowedHeader("*"); // 2 corsConfiguration.addAllowedMethod("*"); // 3 return corsConfiguration; } @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", buildConfig()); // 4 return new CorsFilter(source); }
02 配置拦截器进行全局配置统一跨域配置方法
@Configuration public class WebMvcConfiguration extends WebMvcConfigurerAdapter { @Value("${file.staticAccessPath}") private String staticAccessPath; @Value("${file.uploadFolder}") private String uploadFolder; @Bean public CorsFilter corsFilter() { final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource(); final CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.setAllowCredentials(true); corsConfiguration.addAllowedOrigin("*"); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration); return new CorsFilter(urlBasedCorsConfigurationSource); } @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowCredentials(true) .allowedHeaders("*") .allowedOrigins("*") .allowedMethods("*"); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/upload/**").addResourceLocations("file:" + "upload"); super.addResourceHandlers(registry); } /** * 用于处理编码问题 * * @return */ @Bean public Filter characterEncodingFilter() { CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); characterEncodingFilter.setEncoding("UTF-8"); characterEncodingFilter.setForceEncoding(true); return characterEncodingFilter; } }
03 在每个请求方法上加上跨域注解@CrossOrigin
其实这个注解我感觉还是比较方便的除了配置起来可能每个方法都得加不过有一个好处,就是可以控制部分方法可以被跨域访问,部分方法不可以被跨域访问,这样可以方便的控制方法的安全性。yo
package com.ten.ms.tmsframework.sys.controller; import java.io.File; import java.io.FileOutputStream; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.ten.ms.tmsframework.common.Util.WaterMarkUtil; import com.ten.ms.tmsframework.common.bean.ResultInfo; import com.ten.ms.tmsframework.sys.bean.SysUserOut; import com.ten.ms.tmsframework.sys.bean.SysUserPageInvo; import com.ten.ms.tmsframework.sys.bean.UserInfo; import com.ten.ms.tmsframework.sys.model.SysUser; import com.ten.ms.tmsframework.sys.service.SysUserService; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.*; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.text.SimpleDateFormat; import java.util.*; import java.util.List; /** * 用户管理 */ @CrossOrigin @RestController @RequestMapping("/sys/sysUser") public class SysUserController { @Resource private SysUserService sysUserService; @Resource private SysDictService sysDictService; @RequestMapping(value = "/getUserList", method = {RequestMethod.GET, RequestMethod.POST}) @ResponseBody public ResultInfo getUserList(@RequestBody SysUserPageInvo sysUserPageInvo) { // 定义传参 int page = sysUserPageInvo != null && sysUserPageInvo.getPage() != null ? sysUserPageInvo.getPage() : 0; int rows = sysUserPageInvo != null && sysUserPageInvo.getRows() != null ? sysUserPageInvo.getRows() : 10; // PageHelper.startPage(page, rows); ResultInfo result = new ResultInfo(); if (sysUserPageInvo.getSelectOptions() != null && sysUserPageInvo.getSelectOptions().length > 0 || "1".equals(sysUserPageInvo.getWelfare())|| "2".equals(sysUserPageInvo.getWelfare())) { List<SysUserOut> list = this.sysUserService.getUserList(sysUserPageInvo); result.setRows(list); result.setTotal(list.size()); } else { PageHelper.startPage(page, rows); List<SysUserOut> list = this.sysUserService.getUserList(sysUserPageInvo); PageInfo pageInfo = new PageInfo(list); Page pages = (Page) list; result.setTotal(pageInfo.getTotal()); result.setRows(pages); } return result; } }
总结
以上就是配置跨域的方法,其实方法很简单,根据项目情况,大家选择使用统一配置还是单个方法进行配置。对于我们开发项目来说基本上前后端分离的项目还是很多的,所以可能统一配置比较多一些。这个代码仅供产考,大家可以给小编提出建议,小编进行修改,同事小编也开放了一个博客网站,最近在已经在搞了,大家有兴趣的话可以先浏览一下初版。网址是https://tmspace.cn/这是小编用thinkPHP开发的一个前后端分离的一个博客网站,目前打算用.netCore做一个跨平台的灵活配置的门户博客网站平台,望大家多多提建议有比较好的设计方案也可以和小编合作进行开发,想着完成之后推广给大家使用。

原文出处:微信公众号【 自由的程序员 十分钟空间】
原文链接:https://mp.weixin.qq.com/s/p_4IQPdKO-y8tXjJj7u5nA
本文观点不代表Dotnet9立场,转载请联系原作者。