{"id":17,"date":"2011-06-11T20:11:00","date_gmt":"2011-06-11T18:11:00","guid":{"rendered":"http:\/\/hasselba.ch\/blog\/?p=17"},"modified":"2011-06-23T15:36:34","modified_gmt":"2011-06-23T13:36:34","slug":"xpages-und-reverse-proxies","status":"publish","type":"post","link":"https:\/\/hasselba.ch\/blog\/?p=17","title":{"rendered":"XPages und Reverse-Proxies"},"content":{"rendered":"<p>Beim Aufsetzen eines Reverse-Proxies gilt es im Zusammenspiel mit XPage-basierten Web-Applikationen ein Detail zu ber\u00fccksichtigen: F\u00fcr die Implementierung des Partial Refresh-Mechanismus mu\u00dfte ein zus\u00e4tzlicher HTTP-Header eingef\u00fchrt werden, durch den u.a. Redirects an den Webbrowser gesteuert werden.<\/p>\n<p>Da im Zusammenspiel mit AJAX-basierten Aktionen wie dem Partial Refresh nicht mit vom Server gelieferten HTTP-Responsecodes (302 bzw. 307)\u00a0 gearbeitet werden kann, wird der HTTP-Response der HTTP-Header &#8222;X-XspLocation&#8220; angeh\u00e4ngt.<\/p>\n<p>Beim \u00d6ffnen eines Server-seitigen Links wird so dem Browser mitgeteilt, wohin die Reise geht, und die eigentliche Umleitung wird Clientseitig (via JavaScript) durchgef\u00fchrt. Wird der Header also nicht durch die Regeln im Reverse-Proxy \u00fcberarbeitet, funktioniert die Applikation h\u00f6chstwahrscheinlich nicht.<\/p>\n<p>Hier ein kurzes Beispiel und die HTTP-Daten, die durch Klicken auf den Link gesendet werden.<\/p>\n<h4><span style=\"text-decoration: underline;\">Beispiel-Code eines Links in der XPage:<\/span><\/h4>\n<pre lang=\"x-western\"><span style=\"font-family: Verdana; font-size: x-small; color: #000000;\"> <\/span>&lt;xp:link escape=\"true\" id=\"link1\" text=\"ServerSideLink\"&gt;\r\n &lt;xp:eventHandler event=\"onclick\" submit=\"true\"\r\n refreshMode=\"norefresh\" execMode=\"partial\"&gt;\r\n &lt;xp:this.action&gt;\r\n &lt;xp:actionGroup&gt;\r\n &lt;xp:openPage name=\"<strong>\/XPage2Open.xsp<\/strong>\" \/&gt;\r\n &lt;\/xp:actionGroup&gt;\r\n &lt;\/xp:this.action&gt;\r\n &lt;\/xp:eventHandler&gt;\r\n&lt;\/xp:link&gt;<\/pre>\n<h4 lang=\"x-western\"><span style=\"text-decoration: underline;\">HTTP Request (Client an Server)<\/span><\/h4>\n<pre lang=\"x-western\">POST \/xpage.nsf\/current.xsp?$$ajaxmode=full&amp;$$ajaxid=%40none HTTP\/1.1\r\nHost: blog.hasselba.ch\r\nUser-Agent: Mozilla\/5.0 (Windows NT 6.1; WOW64; rv:2.0.1) ...\r\nAccept: text\/html,application\/xhtml+xml,application\/xml;q=0.9,...\r\nAccept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3\r\nAccept-Encoding: gzip, deflate\r\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\nKeep-Alive: 115\r\nConnection: keep-alive\r\nContent-Type: application\/x-www-form-urlencoded; charset=UTF-8<strong>\r\nX-Requested-With: XMLHttpRequest\r\n<\/strong>Referer: https:\/\/blog.hasselba.ch\/xpages.nsf\/current.xsp\r\nContent-Length: 306\r\nCookie: DomAuthSessId=XXXXX; SessionID=XXXX\r\nPragma: no-cacheCache-Control: no-cache<\/pre>\n<p lang=\"x-western\"><em>[Fett hervorgehoben: Standard-Header bei AJAX-Requests]<\/em><\/p>\n<h4 lang=\"x-western\"><span style=\"text-decoration: underline;\">HTTP Response (Server an Client)<\/span><\/h4>\n<pre lang=\"x-western\">HTTP\/1.1 200 OK\r\nServer: Lotus-Domino\r\nDate: Thu, 09 Jun 2011 06:22:56 GMT\r\n<strong>X-XspLocation: http:\/\/blog.hasselba.ch\/xpages.nsf\/XPage2Open.xsp<\/strong>\r\nContent-Length: 20\r\nConnection: Keep-Alive\r\nContent-Encoding: gzip<\/pre>\n<p><em>[Fett hervorgehoben: Der Header mit dem neuen Ziel. Der Client \u00f6ffnet die Seite via JavaScript]<\/em><\/p>\n<address lang=\"x-western\"> <\/address>\n<address lang=\"x-western\"> <\/address>\n","protected":false},"excerpt":{"rendered":"<p>Beim Aufsetzen eines Reverse-Proxies gilt es im Zusammenspiel mit XPage-basierten Web-Applikationen ein Detail zu ber\u00fccksichtigen: F\u00fcr die Implementierung des Partial Refresh-Mechanismus mu\u00dfte ein zus\u00e4tzlicher HTTP-Header eingef\u00fchrt werden, durch den u.a. Redirects an den Webbrowser gesteuert werden. Da im Zusammenspiel mit &hellip; <a href=\"https:\/\/hasselba.ch\/blog\/?p=17\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,74],"tags":[13,7,11,10,12,3],"class_list":["post-17","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-xpages","tag-administration","tag-domino","tag-http","tag-reverse-proxy","tag-web","tag-xpages"],"_links":{"self":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/17","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=17"}],"version-history":[{"count":16,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/17\/revisions"}],"predecessor-version":[{"id":44,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/17\/revisions\/44"}],"wp:attachment":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=17"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=17"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=17"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}