Javascript 使用基本身份验证和Javaservlet获取URL
我有一个.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调用: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字符串
$("#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);
}
}