{"id":147,"date":"2013-03-29T11:46:00","date_gmt":"2013-03-29T10:46:00","guid":{"rendered":"http:\/\/byteblog.internetallee.de\/?p=147"},"modified":"2024-04-01T15:54:04","modified_gmt":"2024-04-01T13:54:04","slug":"wenn-der-redirect-im-halse-stecken-bleibt","status":"publish","type":"post","link":"https:\/\/blogs.internetallee.de\/byteblog\/2013\/03\/29\/wenn-der-redirect-im-halse-stecken-bleibt\/","title":{"rendered":"Wenn der Redirect im Halse stecken bleibt"},"content":{"rendered":"\n<p>Gestern haben wir unseren <a title=\"nexus Server von sonatype\" href=\"http:\/\/www.sonatype.org\/nexus\" target=\"_blank\" rel=\"noopener\">nexus<\/a>-Server auf den neuesten Stand gebracht und kurz danach funktionierten unsere <a title=\"apache ant\" href=\"http:\/\/ant.apache.org\/\" target=\"_blank\" rel=\"noopener\">ant<\/a>-Skripte zum Herunterladen von Artefakten aus dem nexus nicht mehr. Das Problem war schnell gefunden, die nexus Entwickler haben den Status-Code f\u00fcr einen Redirect von <strong>301 (moved permanently)<\/strong> auf <strong>307 (temporary redirect)<\/strong> ge\u00e4ndert. Das ist wohl moderner und kann den Client vom Caching abhalten. Leider haben die ant Entwickler das in ihren alten Versionen, die wir einsetzen, noch nicht gewusst und kommen damit nicht klar.<\/p>\n\n\n\n<p>Da der nexus aber in einem Servlet Container l\u00e4uft, kann man einen Filter einrichten, der alle Redirects mit Status-Code <strong>307 (temporary redirect)<\/strong> auf den alten Wert <strong>302 (moved temporarily)<\/strong> \u00e4ndert.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Dazu kann der folgende Java-Code genutzt werden:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code data-enlighter-language=\"java\" class=\"EnlighterJSRAW\">package de.bytewurf.example;\n\nimport java.io.IOException;\n\nimport javax.servlet.Filter;\nimport javax.servlet.FilterChain;\nimport javax.servlet.FilterConfig;\nimport javax.servlet.ServletException;\nimport javax.servlet.ServletRequest;\nimport javax.servlet.ServletResponse;\nimport javax.servlet.annotation.WebFilter;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport javax.servlet.http.HttpServletResponseWrapper;\n\n\/**\n * Servlet Filter implementation class ChangeRedirectFilter\n *\/\n@WebFilter(description = \"Changes calls to setStatus with value 307 to 302\", urlPatterns = { \"\/\" })\npublic class ChangeRedirectFilter implements Filter {\n\n\tprivate static class ChangeRedirectWrapper extends\n\t\t\tHttpServletResponseWrapper {\n\n\t\tpublic ChangeRedirectWrapper(HttpServletResponse response) {\n\t\t\tsuper(response);\n\t\t}\n\n\t\t@Override\n\t\tpublic void setStatus(int sc) {\n\t\t\tif (sc == SC_TEMPORARY_REDIRECT) {\n\t\t\t\tsuper.setStatus(SC_MOVED_TEMPORARILY);\n\t\t\t} else {\n\t\t\t\tsuper.setStatus(sc);\n\t\t\t}\n\t\t}\n\n\t}\n\n\t\/**\n\t * @see Filter#destroy()\n\t *\/\n\tpublic void destroy() {\n\t}\n\n\t\/**\n\t * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)\n\t *\/\n\tpublic void doFilter(ServletRequest request, ServletResponse response,\n\t\t\tFilterChain chain) throws IOException, ServletException {\n\t\tif (request instanceof HttpServletRequest\n\t\t\t\t&amp;&amp; response instanceof HttpServletResponse) {\n\t\t\tHttpServletRequest httpRequest = (HttpServletRequest) request;\n\t\t\tHttpServletResponse httpResponse = (HttpServletResponse) response;\n\t\t\tif (!response.isCommitted()) {\n\t\t\t\tchain.doFilter(httpRequest, new ChangeRedirectWrapper(\n\t\t\t\t\t\thttpResponse));\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tchain.doFilter(request, response);\n\t}\n\n\t\/**\n\t * @see Filter#init(FilterConfig)\n\t *\/\n\tpublic void init(FilterConfig fConfig) throws ServletException {\n\t\tfConfig.getServletContext().log(\"init ChangedRedirectFilter\");\n\t}\n\n}<\/code><\/pre>\n\n\n\n<p>Die wichtigsten Komponenten dabei sind zum Einen die Methode <strong>doFilter(req, resp)<\/strong> im Filter, die bei jedem Request aufgerufen wird &#8212; wenn der Filter richtig eingerichtet ist. Die Methode pr\u00fcft, ob es sich um eine HTTP Anfrage handelt und noch nicht&nbsp;<strong>committed<\/strong> ist, sprich die Header schon zum Client gesendet wurden. Ist beides erf\u00fcllt, so wird die Response in einen Wrapper (innere Klasse ChangeRedirectWrapper) gepackt.<\/p>\n\n\n\n<p>Die innere Klasse ChangeRedirectWrapper reicht alle Methodenaufrufe an die eingepackte Response durch, bis auf die <strong>setStatus(code)<\/strong> Methode. Hier wird gepr\u00fcft, ob der Code gleich <strong>307<\/strong> ist. In diesem Fall wird auf der eingepackten Response setStatus mit dem Wert <strong>302<\/strong> aufgerufen.<\/p>\n\n\n\n<p>Nachdem dieser Filter eingerichtet war, funktionierte netterweise auch ant wieder und wir haben Zeit ant auf eine neuere Version zu heben.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gestern haben wir unseren nexus-Server auf den neuesten Stand gebracht und kurz danach funktionierten unsere ant-Skripte zum Herunterladen von Artefakten aus dem nexus nicht mehr. Das Problem war schnell gefunden, die nexus Entwickler haben den Status-Code f\u00fcr einen Redirect von 301 (moved permanently) auf 307 (temporary redirect) ge\u00e4ndert. Das ist wohl moderner und kann den [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[5,32,17,28],"class_list":["post-147","post","type-post","status-publish","format-standard","hentry","category-java","tag-ant","tag-java","tag-nexus","tag-tomcat"],"_links":{"self":[{"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/posts\/147","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/comments?post=147"}],"version-history":[{"count":1,"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/posts\/147\/revisions"}],"predecessor-version":[{"id":211,"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/posts\/147\/revisions\/211"}],"wp:attachment":[{"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/media?parent=147"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/categories?post=147"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/tags?post=147"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}