• HTML5之跨域请求上传文件到OSS


    CORS协议:

      1.COR请求的分类:

          1.简单的COR请求,直接向跨域资源发送请求,包含简单的头和方法.返回的头部信息包含Access-Control-Allow-Origin:www.helloword.com.代表www.helloword.com域名跨域访问.

          2.复杂的COR包含复杂的方法和头,它需要先发送预请求,允许才能发送真实请求

      2.回复的请求头信息的含义

          1.Access-Control-Allow-Origin: http://haha.com.代表允许跨域的域名 *代表所有的域名都跨域跨域

          2.Access-Control-Max-Age: 60,代表在60秒内不需要发送预请求,缓存该结果

          3.Access-Control-Allow-Methods: GET,PUT代表允许get,和put的请求跨域

          4.Access-Control-Allow-Headers: content-type代表允许跨域请求携带context-type信息()

      3.代码

          1.引入tomcat对cor支持的jar包(简单COR请求不需要)CorsFilter过滤器源码分析见(http://www.cnblogs.com/2nao/p/7263977.html)

          <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-catalina</artifactId>
            <version>7.0.78</version>
            <scope>provided</scope>
          </dependency>

          2.配置web.xml

          <filter>
            <filter-name>CorsFilter</filter-name>
            <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
          </filter>

          <filter-mapping>
            <filter-name>CorsFilter</filter-name>
            <url-pattern>/*</url-pattern>
          </filter-mapping>

          3.上传文件代码

      public @ResponseBody
        JSONObject upload(MultipartFile file,HttpServletRequest request,HttpServletResponse response) {
            String requestUrl= URLUtils.getUrl(request);//设置允许访问的白名单
            if(requestUrl == null){//访问者不在白名单里面,返回null
                return null;
            }
    
            log.info("上传文件start");
    
            JSONObject jsonObject = new JSONObject();
            JSONObject data = new JSONObject();
            OSSClient client = new OSSClient(endpoint, accessKeyId, accessKeySecret);
            String originalFilename = file.getOriginalFilename();
            String substring = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
            Random random = new Random();
            String key = random.nextInt(10000) + System.currentTimeMillis() + substring;
    
            try {
                PutObjectResult por = client.putObject(bucketName, key, new ByteArrayInputStream(file.getBytes()));
                // 设置URL过期时间为10年  3600l* 1000*24*365*10
                Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 10);
                // 生成URL
                URL url = null;
                try {
                    url = client.generatePresignedUrl(bucketName, key, expiration);
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    client.shutdown();
                }
                if (url != null) {
                    String urlStr = url.toString();
    
                    if (!urlStr.contains(EXPIRES)) {
                        JsonSettingUtils.setException(jsonObject);
                        log.info("生成文件url失败:url中不包含?Expires字符串");
                        return jsonObject;
                    }
    
                    urlStr = urlStr.substring(0, urlStr.indexOf(EXPIRES));
                    data.put("url", urlStr);
                    response.setHeader("Access-Control-Allow-Origin",requestUrl);//设置跨域允许所有的域名跨域
                                                //设置*会存在,设置跨域的cookie,带不到要跨域的服务端. } } catch (Exception e) { log.error("文件上传失败"); JsonSettingUtils.setException(jsonObject); return jsonObject; } log.info("上传文件end"); JsonSettingUtils.setSuccessAndData(jsonObject, data); return jsonObject; }
    public class URLUtils {
        /**
         * 获取访问者的域名
         * @param request
         * @return
         */
        public static String getUrl(HttpServletRequest request){
    
           
    String url= request.getHeader("Referer");
    if (url == null){
    return null;
    }

    Pattern p = Pattern.compile("(?<=//|)((\w)+\.)+\w+");

    Matcher m = p.matcher(url);

    if(m.find()){
    url= m.group();
    }
    log.info("获取访问者的请求:{}",url );
    for (String string : ConstantUtils.URLS) {
    if (string.equals(url)) {
    return string;
    }
    }
    return null;
    } }
  • 相关阅读:
    Web标准弃用window.applicationCache
    GDI+ DrawString字间距处理
    asp.net cache.count 报错
    CSS3实现文本垂直排列-writing-mode
    使用GDI+ 处理图片成圆图
    html5 input number类型使用整理
    border-radius实例2
    asp.netCore3.0 中使用app.UseMvc() 配置路由
    asp.netCore3.0区域和路由配置变化
    python数据分析个人学习读书笔记-目录索引
  • 原文地址:https://www.cnblogs.com/2nao/p/7147487.html
Copyright © 2020-2023  润新知