webエージェントを通じてクロスドメインアクセスを行い、httpはタイムアウトの問題を返して位置決めを求める。
17410 ワード
【現象】
ajaxがwebエージェントを通じてドメインをまたぐ場合、httpが最初にログインした時は正常ですが、2回目に他のコマンドを発行した時は常に戻ります。 java.net.SocketTimeout Exception:Read timed out。
【位置づけの考え方】
最初のログインは正常で、二回目の訪問は無理です。ほとんどはクッキーと関連しています。ページはログイン時にクッキーを設定することに成功しましたが、ほとんどの原因はウェブエージェント部分のクッキーの伝送に問題があるはずです。代理部分のコードをよく見てみると、webエージェント部分が新しいhttp要求を作成していることに気づきました。cookieは追加されていません。そして、cookieの取得と追加方法をインターネットで検索する。追加すればいいです。
【フロントページコード】
ログインコード:
【webエージェントコードは、servletエンドコードである】
関連の内容は私の他の2つのブログを参照してください。
ajaxクロスドメインアクセスの解決策
jquery.co okie.js使用紹介
ajaxがwebエージェントを通じてドメインをまたぐ場合、httpが最初にログインした時は正常ですが、2回目に他のコマンドを発行した時は常に戻ります。 java.net.SocketTimeout Exception:Read timed out。
【位置づけの考え方】
最初のログインは正常で、二回目の訪問は無理です。ほとんどはクッキーと関連しています。ページはログイン時にクッキーを設定することに成功しましたが、ほとんどの原因はウェブエージェント部分のクッキーの伝送に問題があるはずです。代理部分のコードをよく見てみると、webエージェント部分が新しいhttp要求を作成していることに気づきました。cookieは追加されていません。そして、cookieの取得と追加方法をインターネットで検索する。追加すればいいです。
【フロントページコード】
ログインコード:
function DoLogin()
{
m_szUserPwdValue = Base64.encode("admin" + ":" + "12345");
$.ajax({
type: "GET",
url: m_lHttp + m_szHostName + ":" + m_lHttpPort + "/onlineObservationSystem/PSIA/Custom/SelfExt/userCheck",
async: true,
timeout: 15000,
beforeSend: function(xhr) {
xhr.setRequestHeader("If-Modified-Since", "0");
xhr.setRequestHeader("Authorization", "Basic " + m_szUserPwdValue);
},
success: function(xmlDoc, textStatus, xhr)
{
alert("login success");
if("200" == xhr.status)
{
var szUrl = decodeURI(document.URL);
if(szUrl.indexOf("?page=") != -1)
{
var szPage = szUrl.substring(szUrl.indexOf("page=") + 5, szUrl.indexOf("¶ms="));
if(szPage.indexOf(".asp") == -1)
{
szPage = szPage.concat(".asp");
}
var szParam = szUrl.substring(szUrl.indexOf("¶ms=") + 8, szUrl.length);
$.cookie('page',szPage+"?"+szParam+"%1");
}
else
{
$.cookie('page',null);
}
// cookie $.cookie('userInfo'+'80',m_szUserPwdValue==""?Base64.encode("anonymous:\177\177\177\177\177\177"):m_szUserPwdValue);
//window.location.href = "IEfile/doc/page/main.asp";
}
else
{
if(!$('#UserName').prop("disabled")) {
$('#UserName').focus();
}
$('#UserName').val('');
$('#Password').val('');
alert(translator.translateNode(g_lxdLogin, 'LoginTips4'));
}
},
error: function(xhr, textStatus, errorThrown)
{
alert("login error = " + textStatus);
if("timeout" == textStatus)
{
alert(translator.translateNode(g_lxdLogin, 'ConnectTimeoutTips'));
}
else
{
alert(translator.translateNode(g_lxdLogin, 'NetworkErrorTips'));
}
}
});
}
二回目のアクセスコード:
function GetPatrolsCab() {
$.ajax({
type: "GET",
url: m_lHttp + m_szHostName + ":" + m_lHttpPort + "/onlineObservationSystem/PSIA/PTZ/channels/1/patrols",
async: true,
timeout: 15000,
beforeSend: function(xhr) {
xhr.setRequestHeader("If-Modified-Since", "0");
xhr.setRequestHeader("Authorization", "Basic " + m_szUserPwdValue);
},
success: function(xmlDoc, textStatus, xhr) {
var iLen = $(xmlDoc).find('PTZPatrol').length;
if(0 == iLen) {
alert("get path success,but iLen=0");
//m_oPtzTabs.hideTab(1);
return;
}
$("#selectPatrol").empty();
var szName = parent.translator.translateNode(g_lxdPreview, 'laTrack');
for(var i = 0; i < iLen; i++) {
if (i < 9) {
$("<option value='"+ (i+1) +"'>"+szName+" 0"+(i+1)+"</option>").appendTo("#selectPatrol");
} else {
$("<option value='"+ (i+1) +"'>"+szName+" "+(i+1)+"</option>").appendTo("#selectPatrol");
}
}
$("#selectPatrol").unbind().bind("change",function() {
GetPatrol(this.value);
});
GetPatrolsDelayCab();
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert("get path error");
//m_oPtzTabs.hideTab(1);
}
});
}
【webエージェントコードは、servletエンドコードである】
package com.boomdts.weather_monitor.servlet.video;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.util.List;
import javax.servlet.*;
import javax.servlet.http.*;
public class psiaFilter implements javax.servlet.Filter {
public void destroy() {
}
//char byte
private byte[] getBytes (char[] chars) {
Charset cs = Charset.forName ("UTF-8");
CharBuffer cb = CharBuffer.allocate (chars.length);
cb.put (chars);
cb.flip ();
ByteBuffer bb = cs.encode (cb);
return bb.array();
}
//byte char
private char[] getChars (byte[] bytes) {
Charset cs = Charset.forName ("UTF-8");
ByteBuffer bb = ByteBuffer.allocate (bytes.length);
bb.put (bytes);
bb.flip ();
CharBuffer cb = cs.decode (bb);
System.out.println("in size=" + bytes.length + "out size = " + cb.array().length);
return cb.array();
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//
HttpServletRequest req = (HttpServletRequest)(request);
String uri = req.getRequestURI();
uri = uri.substring(24);//
String Auth = req.getHeader("Authorization");
String method = req.getMethod();
Cookie[] cookies = req.getCookies();// cookie,
HttpServletResponse res = (HttpServletResponse)(response);
// http , ( )。
String url= "http://172.16.8.178" + uri;
//System.out.println("url = " + url);
URL theURL = new URL(url);
HttpURLConnection urlConnection = (HttpURLConnection)theURL.openConnection();
urlConnection.setReadTimeout(500000);
System.out.println("method = " + method);
urlConnection.setRequestMethod(method);
urlConnection.setRequestProperty("If-Modified-Since", "0");
urlConnection.setRequestProperty("Authorization", Auth);
for(Cookie c:cookies){
urlConnection.addRequestProperty("Cookie", c.getName() + "=" + c.getValue());// cookie,
//System.out.println("cookie name=" + c.getName() +"; value=" + c.getValue());
}
urlConnection.connect();
PrintWriter out = res.getWriter();
// http ,
if (urlConnection.getResponseCode() == 200)
{
System.out.println("urlConnection return success");
//
InputStream in = urlConnection.getInputStream();
int c;
while((c = in.read()) != -1)
out.write(c);
} else {
System.out.println("error! urlConnection.getResponseCode() = " + urlConnection.getResponseCode());
}
}
public void init(FilterConfig arg0) throws ServletException {
}
}
関連の内容は私の他の2つのブログを参照してください。
ajaxクロスドメインアクセスの解決策
jquery.co okie.js使用紹介