Javascript 使用基本身份验证和Javaservlet获取URL

Javascript 使用基本身份验证和Javaservlet获取URL,javascript,java,html,servlets,httpurlconnection,Javascript,Java,Html,Servlets,Httpurlconnection,我有一个.jsp页面,它处理一些基本的html(文本字段、要填充的表格的提交按钮)和javascript。单击后,它调用我的Javaservlet类,该类分别处理来自jsp和来自jsp的请求和响应。我还有一个Java类来处理url连接,以使用GET进行REST调用,该调用将返回json字符串结果。这是一个场景:用户希望通过输入一个ID值来进行简单的搜索,使用REST填充表,以连接到url并获得json响应 我单独测试了Java类,通过URL连接和基本身份验证进行REST调用,以获取json字符串

我有一个.jsp页面,它处理一些基本的html(文本字段、要填充的表格的提交按钮)和javascript。单击后,它调用我的Javaservlet类,该类分别处理来自jsp和来自jsp的请求和响应。我还有一个Java类来处理url连接,以使用GET进行REST调用,该调用将返回json字符串结果。这是一个场景:用户希望通过输入一个ID值来进行简单的搜索,使用REST填充表,以连接到url并获得json响应

我单独测试了Java类,通过URL连接和基本身份验证进行REST调用,以获取json字符串格式的数据,它工作得非常好。(我已经编写了4种不同的方法来完成这项工作,所有方法都可以很好地工作并返回预期的json)

我已经分别测试了jsp页面,该页面调用servlet来填充表中的“虚拟”值,servlet响应良好,表按预期填充

问题是:

当我试图用从GET REST调用中获得的值填充表时,它挂起,我没有得到任何结果。因此,我试图调查原因,发现出于某些疯狂的原因,servlet不喜欢用基本身份验证设置标题以访问URL的代码行。我试着注释基本的auth1行代码(为了调试,所以现在我们没有身份验证),但是传递一些“虚拟”硬编码数据,它填充了表

当我设置身份验证时,我实际上不知道servlet为什么不喜欢它。我猜它可能正在覆盖servlet的响应路径,因此丢失了jsp的初始响应位置?(即,将json发送回哪里?)这里有人能帮我吗?有人知道发生了什么吗?我对这个问题的假设正确吗?如果是,我如何克服这个问题

对servlet的Javascript调用:

$("#myForm2").submit(function(e) {
$.ajax({
       type: "GET",
       url: "servlet1", // the script where the form input is handled.
       data: $("#myForm2").serialize(), // serializes the form's elements.
       success: function(responseData){
            var dataObj = $.parseJSON(responseData)
            $('#myTable').append(>>add values to table here<<);
       });

e.preventDefault(); // avoid to execute the actual submit of the form.
$("#myForm2")[0].reset(); // clear previous values entered
});
我的Java类方法进行URL调用和基本身份验证:

String testJsonString = "defaultValue";//testing purposes

//creates a valid encoded authentication string
private String basicAuth(String name, String pass){
    String authString = name + ":" + pass;
    byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
    String authStringEnc = new String(authEncBytes);
    return authStringEnc;    
}

private HttpURLConnection prepareGETConnection(final URL verifierURL)
throws IOException {                    
    final HttpURLConnection connection = (HttpURLConnection) verifierURL.openConnection();
    connection.setRequestMethod("GET");

    //this is the line which authorizes access to the url via Basic Auth
    connection.setRequestProperty("Authorization", "Basic " + basicAuth(name, password));

    return connection;
}

public void connectToUrlAndMakeAGetRequest(){
    try {
        String webPage = "URL HERE";// pass it a valid REST url with endpoints
        URL url = new URL(webPage);
        HttpURLConnection conn = prepareGETConnection(url);

        // get the url response json string
        InputStream getUrlresponse = conn.getInputStream(); 
        BufferedReader rd = new BufferedReader(new InputStreamReader(getUrlresponse));
        //get only the first line of the string - testing purposes only!
        testJsonString = rd.readLine();
        rd.close();
        conn.disconnect();

    } catch(IOException e){
        System.out.println("IO exception: "+e);
    }
} 

您在这里提供的代码没有明确说明应该发生什么,但我假设:
javascript-ajax-->servlet-->Java::Rest-class-->servlet-->ajax-response
。但是,您正在使用的所有方法都已尝试以特定方式处理标头。最可能的情况是,标头已发送,无法修改。在ajax请求中指定内容类型,
接受servlet中的
头,到
application/json
。您从代码中剥离了类定义和包装器,因此很难准确地了解到底发生了什么。请尝试清理一下,让它更清楚。@TonyChiboucas正确的:
javascript-ajax-->servlet-->Java::Rest-class-->servlet-->ajax-response
。servlet的类定义:
public class Servlet1扩展了HttpServlet{
Rest类的类定义:
public class Rest实现java.io.Serializable{
关于头,我尝试用头加载Rest类,除了基本的auth头,它成功地用伪值填充jsp中的表。我还尝试使用
addRequestProperty()
而不是
setRequestProperty()
为了避免覆盖基本的auth头,仍然没有运气。除此之外,servlet和Rest类上的java代码只包含声明的一些变量,目前我只去掉了两个因素,那就是我在
basicAuth(字符串名称,字符串传递)上硬编码用户名和密码
方法和需要基本身份验证的URL链接。我正在使用
import org.apache.commons.codec.binary.Base64;
进行编码,其他所有内容都是标准Java。您的描述说javascript可以工作,但这段代码无法:`$('#myTable')。append(>>将值添加到表中此处提供的代码没有明确说明应该发生什么,但我假设:
javascript ajax-->servlet-->Java::Rest class-->servlet-->ajax response
。但是,您使用的所有方法都已尝试以特定方式处理头。很可能是DER已经发送,无法修改。请在ajax请求中指定内容类型,并将servlet中的
接受
头发送到
application/json
。您从代码中删除了类定义和包装,这使您很难准确了解到底发生了什么。请尝试清理一下,然后更清楚一点。@TonyChiboucas正确:
javascript ajax-->servlet-->Java::Rest class-->servlet-->ajax response
。servlet的类定义:
public class Servlet1扩展了Rest类的HttpServlet{
类定义:
public class Rest实现了Java.io.Serializable{
关于头,我尝试用头加载Rest类,除了基本的auth头,它成功地用伪值填充jsp中的表。我还尝试使用
addRequestProperty()
而不是
setRequestProperty()
为了避免覆盖基本的auth头,仍然没有运气。除此之外,servlet和Rest类上的java代码只包含声明的一些变量,目前我只去掉了两个因素,那就是我在
basicAuth(字符串名称,字符串传递)上硬编码用户名和密码
方法和需要基本身份验证的URL链接。我正在使用
import org.apache.commons.codec.binary.Base64;
进行编码,其他所有内容都是标准Java。您的描述说javascript可以工作,但这段代码无法:`$('.#myTable')。追加(>>将值添加到表中
String testJsonString = "defaultValue";//testing purposes

//creates a valid encoded authentication string
private String basicAuth(String name, String pass){
    String authString = name + ":" + pass;
    byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
    String authStringEnc = new String(authEncBytes);
    return authStringEnc;    
}

private HttpURLConnection prepareGETConnection(final URL verifierURL)
throws IOException {                    
    final HttpURLConnection connection = (HttpURLConnection) verifierURL.openConnection();
    connection.setRequestMethod("GET");

    //this is the line which authorizes access to the url via Basic Auth
    connection.setRequestProperty("Authorization", "Basic " + basicAuth(name, password));

    return connection;
}

public void connectToUrlAndMakeAGetRequest(){
    try {
        String webPage = "URL HERE";// pass it a valid REST url with endpoints
        URL url = new URL(webPage);
        HttpURLConnection conn = prepareGETConnection(url);

        // get the url response json string
        InputStream getUrlresponse = conn.getInputStream(); 
        BufferedReader rd = new BufferedReader(new InputStreamReader(getUrlresponse));
        //get only the first line of the string - testing purposes only!
        testJsonString = rd.readLine();
        rd.close();
        conn.disconnect();

    } catch(IOException e){
        System.out.println("IO exception: "+e);
    }
}