【问题标题】:Cross Origin requests at server side服务器端的跨域请求
【发布时间】:2018-03-02 11:49:55
【问题描述】:

您好,当我尝试打开使用 java 从数据库中检索的文件时,我在服务器端遇到了跨源请求的问题。我不知道这个跨源请求。当点击文件时,它会给出错误

jquery.min.js:4 XMLHttpRequest 无法加载文件:///C:/Users/JR00432239/Desktop/trial/src/temp/filetest1.docx。跨源请求仅支持协议方案:http、data、chrome、chrome-extension、https。

谁能帮我解决这个问题。

这是我的java代码:

package fileretrieve;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

import org.apache.tomcat.util.http.fileupload.IOUtils;

import dbConnection.Dbconn;

@MultipartConfig
public class FileRetrieve extends HttpServlet {



    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
          response.setContentType("text/plain");

          PrintWriter out = response.getWriter();        
          String onelevel=request.getParameter("onelevel"); 







          Connection conn = null; // connection to the database
          String message = null;
          Statement st = null;// message will be sent back to client



          try {
              // connects to the database
              conn = Dbconn.getConnection();
                st = conn.createStatement();

                 PreparedStatement ps=conn.prepareStatement("select data from files1 where board=?");
                 ps.setString(1,onelevel);                   
                 //out.print("<table width=25% border=1>");
                // out.print("<center><h1>Result:</h1></center>");
                 ResultSet rs=ps.executeQuery();                
                 /* Printing column names */
                 ResultSetMetaData rsmd=rs.getMetaData();
                 int count=0;
                 while(rs.next())
                    {
                     count=count+1;
                     FileOutputStream fos = new FileOutputStream("C:\\Users\\JR00432239\\Desktop\\trial\\src\\temp\\filetest"+count+".docx");
                     fos.write(rs.getBytes(1));
                     fos.close();

//                 out.print("<tr>");
//                 out.print("<td>"+rsmd.getColumnName(1)+"</td>");
//                    out.print("<td><a href=\"file:///C:/Users/JR00432239/Desktop/trial/src/temp/test.pdf\" target=\"_self\">"+count+"</a></td></tr>");
//                    getServletContext().getRequestDispatcher("/home.html").forward(request, response);
                     System.out.println("writing...");
                     response.getWriter().write("{\"name\":\""+count+"\",\"path\":\"C:/Users/JR00432239/Desktop/trial/src/temp/filetest"+count+".docx\"}");



                 }


//                 out.print("</table>");
//                 


          }catch (Exception e2)
            {
                e2.printStackTrace();
            }

          finally{

//            request.setAttribute("data", data);
//            RequestDispatcher rd =request.getRequestDispatcher("userview.jsp");
//            

              out.close();
            }


          // forwards to the message page
        //  getServletContext().getRequestDispatcher("/home.html").forward(request, response);
   }

}   

这是我的 html 代码: 提交

这是我的 javascript 页面:

$("#retrieve").click(function(){

     $.ajax({
            url : 'FileRetrieve',
            method:"POST",
            data : {
                onelevel : $('#onelevel').val()
            },

            crossDomain: true,
            success : function(responseText) {
                var data=JSON.parse(responseText)
                $("#files_data").html('')
                $("#files_data").html('<table><tr><td><button onclick="getFile()">'+data.name+'</button></td></tr></table>')

            },
            error: function(XMLHttpRequest, textStatus, errorThrown) { 
                alert("Status: " + textStatus); alert("Error: " + errorThrown); 
            }
        });
     return false;
 });

【问题讨论】:

  • Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https - 那么您使用的是哪种协议方案?注意:url : 'FileRetrieve', 永远不会跨源,除了在 chrome on file:/// 协议方案中 - 但你不能使用 file:/// 因为你有服务器端代码,所以......很困惑?
  • 实际上我将所有检索的文件存储在本地文件夹中。所以我正在使用 file:///
  • 好吧,你不能,绝对不能用 Chrome

标签: javascript java jquery


【解决方案1】:

如果您使用的是 chrome,请尝试使用 chrome 扩展,例如 Allow-Control-Allow-Origin:* https://chrome.google.com/webstore/detail/nlfbmbojpeacfghkpbjhddihlkkiljbi?utm_source=chrome-app-launcher-info-dialog

如果不固定, 使用带有标志的命令行运行 chrome

path/to/chrome.exe --allow-file-access-from-files

或者只是切换到Firefox并检查问题是否仍然存在

这只是开发中的快速修复

编辑

据我所知,您能做的最好的事情是使文件在 http 服务器中可用并使用 http 协议访问它们。

【讨论】:

  • 是的,我用 chrome 检查过,即使我遇到了这个问题
  • 我用上面提到的路径签入了 chrome,但它没有修复,甚至在 chrome 中重复也是如此
  • 尝试使文件在 http 服务器中可用,并在访问文件时使用 http 路径。
  • 为了使 apache 可以在应用程序之外访问文件,我尝试将 添加到 apache server.xml 中的 标记,但我面临同样的问题问题
猜你喜欢
  • 2014-07-23
  • 2012-04-18
  • 2012-10-24
  • 1970-01-01
  • 2018-12-05
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
相关资源
最近更新 更多