Я не могу получить responseText из сервлета с помощью AJAX - PullRequest
1 голос
/ 25 апреля 2011

У меня есть файл сервлета с именем NewServlet.java.Этот сервлет вызывается моим AJAX-скриптом для получения ответа.

Я проверил сервлет, протестировав его в браузере.

Но когда я вызываю его из своего AJAX-скрипта, он дает мнепусто responseText и ошибка, которая говорит

XMLHttpRequest не может загрузить http://localhost:8084/WebApplication1/NewServlet. Нулевой источник не разрешен Access-Control-Allow-Origin

NewServlet.java

import java.io.*;
import java.net.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class NewServlet extends HttpServlet {


    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();


        out.println("<option value='1'>one</option>");
        out.println("<option value='2'>two</option>");
        out.println("<option value='3'>three</option>");
        out.println("<option value='4'>four</option>");
        out.println("<option value='5'>five</option>");
        out.close();
    }


    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }


    public String getServletInfo() {
        return "Short description";
    }

}

test.html

<html>

<head>
    <script language = "javascript">
        var xmlDoc = 0;
        var xhttp = 0;
        function reciveData()
        {

            if (window.XMLHttpRequest)
            {
                xhttp=new XMLHttpRequest();
            }
            else // IE 5/6
            {
                xhttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
            xhttp.onreadystatechange = redirectUser;        
            xhttp.open("GET","http://localhost:8084/WebApplication1/NewServlet",true);
            xhttp.send();
            }

        function redirectUser()
        {
            if (xhttp.readyState == 4)
            {
                log = 0;
                xmlDoc = xhttp.responseText;
                alert(xmlDoc);
            }
        }
    </script>
</head>
<body onload="reciveData()">

</body>
</html>

Может ли кто-нибудь указать мне правильное направление?

Спасибо.

Ответы [ 4 ]

4 голосов
/ 25 апреля 2011

Это на стороне браузера ... модель безопасности позволяет только запросы AJAX на тот же хост / порт, с которого вы загрузили страницу. Убедитесь, что вы загрузили свою страницу через сервер (например, http://localhost:8084/test.html) и не загрузили ее через файловую систему. Тогда вам следует начать ... или хотя бы продолжить отладку.;)

3 голосов
/ 26 апреля 2011

Это действительно может произойти, когда сервлет работает на порте, отличном от того, откуда поступает запрос ajax. Это нарушает Same Origin Policy для запросов ajax и, следовательно, браузер не будет обрабатывать ответ ajax. Помимо размещения сервлета за тем же портом, другие решения должны возвращать JSONP вместо этого или позволить сервлету устанавливать заголовки HTTP Access-Control.

response.setHeader("Access-Control-Allow-Origin", "*");

Однако вам следует помнить, что таким образом ваш сервлет с помощью Ajax доступен для каждого . Если сервлет возвращает конфиденциальную информацию, то это дыра в безопасности. Но если это не так и предполагается, что это будет публичный веб-сервис, тогда это безопасно.

1 голос
/ 09 марта 2013
This will solve your issue..
// Ajax response

res.setContentType("text/javascript");
res.setCharacterEncoding("UTF-8");
res.setHeader("Cache-Control", "no-cache");
PrintWriter out = res.getWriter();
out.print("GRANTED");
out.close();
1 голос
/ 25 апреля 2011

По моему опыту, если вы хотите загрузить данные с помощью ajax, отправьте запрос в файл jsp и получите текст ответа из этого файла jsp.Гендель намного проще.посмотрите этот пример, если вам нравится

EDITED << </p>

================================ ajax_load.js:

    var xmlhttp;

    function loadAdminRight(category){

    xmlhttp = GetXmlHttpObject();
    if (xmlhttp == null) {
        alert("Your browser does not support Ajax HTTP");
        return;
    }
    var url = "load.jsp";

    url = url + "?category="+category;
    xmlhttp.onreadystatechange = getLoad;
    xmlhttp.open("GET", url, true);
    xmlhttp.send(null);


   }


    function getLoad(){
    if (xmlhttp.readyState == 4) {
        document.getElementById("right_content").innerHTML = xmlhttp.responseText;
                //or what you want to do
    }
}

========================== load.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%

String l_category = request.getParameter("category");

if(l_category.equals("article")){
        out.write("You have choosen article category");
        out.write("<br/>");
    }

}else if(l_category.equals("news")){
        out.write("You have choosen article category");
        out.write("<br/>");
            }
%>

и чтобы запустить ajax, вам просто нужно вызвать функцию .js из того места, где вы хотите, например, при нажатии кнопки: onClick = "loadAdminRight (" article ");"

и вы можете импортировать ваши классы java в файл jsp, добавив <% page import =" "%> в начало вашей страницы jsp, например:

<% @ page import= "com.omicc.classes.Article"%>

написать свой собственный файл load.jsp, который обрабатывает ответ, а затем использовать out.write в вашем файле jsp для записи текста ответа.

Я хочу, чтобы это помогло тебе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...