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做一个跨平台的灵活配置的门户博客网站平台,望大家多多提建议有比较好的设计方案也可以和小编合作进行开发,想着完成之后推广给大家使用。

java最优雅的跨域配置

原文出处:微信公众号【 自由的程序员 十分钟空间】

原文链接:https://mp.weixin.qq.com/s/p_4IQPdKO-y8tXjJj7u5nA

本文观点不代表Dotnet9立场,转载请联系原作者。

发表评论

登录后才能评论