Search code examples
javauriapache-httpclient-4.xhttp-status-code-302

How to handle 302 redirection in java


I have a url from which i am fetching a token. That part is working fine. Then this token is being used to in another url to get value. But while doing that I am getting a 302 error. So, I tried to take the location parameter from the response header and use it in the url. But I am getting the below error

org.apache.http.client.ClientProtocolException
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:187)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
    at com.citi.clg.originations.strategic.service.CertDashboardServiceImpl.getService(CertDashboardServiceImpl.java:800)
    at com.citi.clg.originations.strategic.dwr.CertDashboardAJAXLookup.getService(CertDashboardAJAXLookup.java:114)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.directwebremoting.impl.CreatorModule$1.doFilter(CreatorModule.java:172)
    at org.directwebremoting.impl.CreatorModule.executeMethod(CreatorModule.java:184)
    at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:353)
    at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:306)
    at org.directwebremoting.dwrp.BaseCallHandler.handle(BaseCallHandler.java:110)
    at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:211)
    at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:185)
    at org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:144)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:138)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:528)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:810)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.http.ProtocolException: Target host is not specified
    at org.apache.http.impl.conn.DefaultRoutePlanner.determineRoute(DefaultRoutePlanner.java:71)
    at org.apache.http.impl.client.InternalHttpClient.determineRoute(InternalHttpClient.java:125)
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
    ... 43 more

Below is my code

String id=jobj1.get("ID").toString();
          try {
                HttpPost httpPost;
          httpPost = new HttpPost(
                    "https://example.com");

        //httpPost.setEntity(new StringEntity(data));
        httpPost.setHeader("Accept", "application/json");
        httpPost.setHeader("Content-type", "application/json");
        CloseableHttpResponse response = client.execute(httpPost);
        System.out.println(response.getEntity().getContent());
        System.out.println(response.getStatusLine().getStatusCode());
        System.out.println(response.getHeaders("Location").toString());
        String tempUrl=response.getHeaders("Location")[0].getValue().replaceAll(" ", "%20");
        System.out.println(response.getHeaders("Location")[0].getValue().replaceAll(" ","%20"));
        System.out.println(tempUrl.replace("|","%7c"));
        if(response.getStatusLine().getStatusCode()==302)
        {
            System.out.println(response.getHeaders("Location")[0].getValue().replaceAll(" ", "%20").replace("|", "%7c"));
            httpPost=new HttpPost(URLEncoder.encode(response.getHeaders("Location")[0].getValue(),"UTF-8"));
            //httpPost=new HttpPost(response.getHeaders("Location")[0].getValue().replaceAll(" ", "%20").replace("|", "%7c"));
            httpPost.setHeader("Accept", "application/json");
            httpPost.setHeader("Content-type", "application/json");
             response = client.execute(httpPost);
        }
        if (response.getStatusLine().getStatusCode() == 200 ) {
            BufferedReader br = new BufferedReader(new InputStreamReader((response.getEntity().getContent())));
            String output;
            while ((output = br.readLine()) != null) {
                responseData = responseData + output;
            }
        } else {
            responseData = "{\"status\": \"ERROR\"}";
        }

    } catch (Exception e) {
        e.printStackTrace();
        responseData = "{\"status\": \"ERROR\"}";
    } finally {
        try {
            client.close();
        } catch (IOException e) {
        }
    }

Here is my redirect url

Location: /enlight.server/login.jsp?goto=/enlight.server/html/scripts/api/assets.jsp?all=true&globalCrit=Host where name:sdcgcgtiblb20pv | Certificates where Until>1d AND Until<31d &action=table&envId=92738683& EvolvenSessionKey=377d58e55aa4b81eaeb9028226b7a64565c57fc9&Json=true


Solution

  • I had been taking the token and closing the session and reopening the session which caused the invalidation of the token and redirection