X.d 笔记

小Web,大世界

0%

HTML5跨域上传

HTML5 规范定义了 File Api,可以和以往 Flash 上传一样,读取选择的文件信息,还可以监听上传进度显示在页面上。

跨域

使用flash实现时,若文件上传到的地址和当前上传的页面不在同一个域下面,则要加入 crossdomain.xml 跨域允许文件,Flash 会先去取上传地址上的文件看当前域是否得到许可,如果可以则执行上传。

HTML5 上传也有安全机制,一般情况下是不允许跨域上传的,上传前会先去使用http options方法探测有没有权限,地址为上传地址,所以要在上传地址里面加入允许。

在 Java 中,上传地址一般是 Servlet,需要在doPost和doOptions加上Header

doPost主要用于上传,doOptions用于上传过程中监听进度。也就是说没有加doOptions跨域允许也是可以上传的,只无法获取上传的进度,和表单上传没有什么区别。

@Override
 protected void doPost(HttpServletRequest arg0, HttpServletResponse arg1)
   throws ServletException, IOException {
  arg1.setHeader("Access-Control-Allow-Origin", "*");
 }

@Override
 protected void doOptions(HttpServletRequest arg0, HttpServletResponse arg1)
   throws ServletException, IOException {
  arg1.setHeader("Access-Control-Allow-Origin", "*"); 
 }

PHP等,只要在处理上在传的PHP里面加一句话即可

header('Access-Control-Allow-Origin','*');

允许多个域

要注意的是 Access-Control-Allow-Origin 只能有一个值,要么是*即允许所有来源,一看就知道是不安全的。

另外还有一种是固定网址,如 http://www.xxx.com, 需要注意的是,只支持http://www.xxx.com,不能用 *.xxx.com来支持多个。所以如果要像Flash上传一样支持多个网站来源是不可能的,但可以通过代码解决

private String getCrossOrgin(requestUrl){
    String[] safeurl = new String[]{"http://www.xxx.com","http://site.xxx.com"};
    for(int i=0; i < safeurl.length ; i++){
        if(requestUrl.startWith(safeurl[i])){
            return safeurl[i];
        }
    }
    return safeurl[0];
}