zoukankan      html  css  js  c++  java
  • 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;
    } }
  • 相关阅读:
    Python异常处理
    Python 线程、进程和协程
    python版本升级及pip部署方法
    Python socket编程
    循环遍历方法笔记
    TCP/IP协议分为哪四层,具体作用是什么。
    Python Paramiko模块与MySQL数据库操作
    Python面向对象编程(二)
    h5专题常用小代码
    sethc问题
  • 原文地址:https://www.cnblogs.com/2nao/p/7147487.html
Copyright © 2011-2022 走看看