需要配置一个mvc适配器,基于springboot2.1.3
上面的第一个override是配置了拦截器,拦截登录与否,并排除掉外部接口和登录页面,第二个才是跨域问题解决需要的CorsRegistry ,可直接复制
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.xxccc.aaaa.interceptor.UserLoginInterceptor;
@Configuration
public class UserLoginAdapter implements WebMvcConfigurer{
@Autowired
private UserLoginInterceptor userLoginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加对用户是否登录的拦截器,并添加过滤项、排除项
registry.addInterceptor(userLoginInterceptor).addPathPatterns("/**")
.excludePathPatterns("/css/**","/js/**","/images/**","/lib/**")//排除样式、脚本、图片等资源文件
.excludePathPatterns("/index.html")//排除登录页面
.excludePathPatterns("/get/allBaseInfo")//排除外部接口1
.excludePathPatterns("/addBaseInfoRight")//排除外部接口2
.excludePathPatterns("/getUser");//排除用户点击登录按钮
}
//后台接口跨域
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedMethods("GET", "POST")
//Access-Control-Allow-Credentials
/* 该字段可选。它的值是一个布尔值,表示是否允许发送Cookie.默认情况下,不发生Cookie,即:false。
对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json,这个值只能设为true。
如果服务器不要浏览器发送Cookie,删除该字段即可。*/
.allowCredentials(true).maxAge(3600);
}
}
//之后在需要进行跨域访问的接口上面加上注解:
@CrossOrigin(origins = "*", maxAge = 3600) //* 可以改成ip地址
.....
还有说直接在需要进行跨域访问的接口上面加上注解就ok的(没测试,因为我的项目使用了拦截器)
@CrossOrigin (origins = "*", maxAge = 3600)
网上还能搜到Nginx方向代理解决跨域访问
原文链接:https://blog.csdn.net/crystalcs2010/article/details/88865473
server {
listen 80; #监听80端口,可以改成其他端口
server_name localhost; # 当前服务的域名
# 反向代理所有/apis开头的访问请求
location /apis {
proxy_pass http://localhost:8080;
}
}
————————————————
版权声明:本文为CSDN博主「众神之翼」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
补全
只get不传参数可以使用上面的方式进行接口处理,但是一旦传值,参数的值一般是JSON但是接收的时候可能是String,也可能是Map,取决于对方的设置请求头,作为一个后台Coder感觉很难过。。。
//post请求会发送OPTIONS请求,需要进行前置处理
//配置新Class外部拦截器OuterInterceptor
@Component
public class OuterInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) {
String method = request.getMethod();
if(HttpMethod.OPTIONS.toString().equals(method)) {
response.setStatus(HttpStatus.NO_CONTENT.value());
}
return true;
}
}
//adapter类中增加此拦截器的配置
registry.addInterceptor(outerInterceptor).addPathPatterns("/addBaseInfoRight")
.addPathPatterns("/getUserBaseRight");
//后台代码
@RequestMapping(value="/addBaseInfoRight", method=RequestMethod.POST)
public Result addBaseInfoRight(@RequestBody String map,HttpServletRequest req) {
JSONObject requestParam = JSON.parseObject(map);
String dataString = requestParam.get("data").toString();
JSONArray dataArray = JSON.parseArray(dataString);
List<Map<String, Object>> resultData = getResultData(dataArray);
Integer count = 0;
for (Map<String, Object> map2 : resultData) {
List<Map<String, Object>> idMap = baseInfoService.selectBaseInfoRightId(map2);
if(!idMap.isEmpty()) {
Integer i = baseInfoService.updateBaseInfoRight(map2);
count+=i;
}else {
Integer i = baseInfoService.addBaseInfoRight(map2);
count+=i;
}
}
//result是我写的返回结果类,继承了hashMap
if(count != null && count != 0) {
return Result.outer("0", "修改成功",String.valueOf(count));
}else {
return Result.outer("1", "修改失敗",null);
}
}
拦截器直接配置拦截POST参数(此方案未尝试,但在面对多个外部接口时,此方案是必要的)
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class ParamInterceptor implements HandlerInterceptor {
private Map<String,String> param = new HashMap<String,String>();
@Override
public void afterCompletion(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse,
Object obj, Exception exception) throws Exception {
}
@Override
public void postHandle(HttpServletRequest req, HttpServletResponse rep, Object obj,
ModelAndView modelandview) throws Exception {
String path = req.getContextPath();
String basePath = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + path + "/";
req.setAttribute("param", param);
req.setAttribute("basePath", basePath);
}
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse rep, Object obj)
throws Exception {
Map<String,String[]> map = req.getParameterMap();
for (String key : map.keySet()) {
if(map.get(key) != null){
param.put(key, map.get(key)[0].toString());
}
}
return true;
}
}