简体   繁体   English

HttpUrlConnection重定向到其他servlet没有发生

[英]HttpUrlConnection redirection to other servlet is not happening

I have the following code which will call the server through HttpUrlConnection . 我有以下代码将通过HttpUrlConnection调用服务器。

String response = HttpUtil.submitRequest(json.toJSONString(), "http://ipaddr:port/SessionMgr/validateSession?sessionId=_78998348uthjae3a&showLoginPage=true");

The above lines will call the following code: 以上几行将调用以下代码:

public static String submitRequest(String request, String **requestUrl**) {
    try {
        URL url = new URL(requestUrl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setDoOutput(true);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
        OutputStream os = conn.getOutputStream();
        os.write(request.getBytes());
        os.flush();
        if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + conn.getResponseCode());
        }

        BufferedReader br = new BufferedReader(new InputStreamReader(
                (conn.getInputStream())));
        String output;
        StringBuffer sb = new StringBuffer();
        while ((output = br.readLine()) != null) {
            sb.append(output);
        }
        conn.disconnect();
        return sb.toString();

    } catch (MalformedURLException e) {
    } catch (IOException e) {
    }
    return "";
}

The requestUrl will go to the servlet below: requestUrl将转到下面的servlet:

public class ValidateSessionServlet extends HttpServlet {
    String session = req.getParameter(sessionId);
    if (session == null) {
    // redirect to servlet which will display login page.
    response.setContentType("text/html");
            String actionUrl = getIpPortUrl(request)
                            + PropertyConfig.getInstance().getFromIdPConfig(globalStrings.getCheckSSOSession());
            out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\"> \n");
            out.write("<html><head><body onload=\"document.forms[0].submit()\">\n");
            out.write("<form method=\"POST\" action=\"" + actionUrl + "\">\n");
            out.write("<input type=\"hidden\" name=\"locale\" value=\"" + locale + "\"/>\n");
            out.write("<input type=\"hidden\" name=\"Sessionrequest\" value=\"" + true + "\"/>\n");
            out.write("</form>\n</body>\n</html>\n");
     }
}

In the above code the form should go to the servlet as mentioned in the actionUrl, but it is again going to servlet which is in step(1). 在上面的代码中,表单应该转到actionUrl中提到的servlet,但是它再次转到步骤(1)中的servlet。

1) May i know can we make this above html form in step(3) to submitted and redirect to the servlet in actionUrl . 1)我可以知道我们可以在步骤(3)中将上面的html表单提交并提交并重定向到actionUrl中的servlet。

As per the above code i am summarizing the requirement. 根据上面的代码,我总结了要求。 If the session is null, I have to redirect the user to login page and validated against database and then the response should go to step(1), Is it possible? 如果会话为空,我必须将用户重定向到登录页面并对数据库进行验证,然后响应应转到步骤(1),是否可能?

If you want your HttpUrlConnection to support redirections, you need to set your HttpUrlConnection like this: 如果您希望HttpUrlConnection支持重定向,则需要像下面这样设置HttpUrlConnection

...
conn.setRequestProperty("User-agent", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1");
conn.setInstanceFollowRedirects(true);
...

Then if your server redirect your request somewhere else, conn will receiver the redirected response. 然后,如果您的服务器将您的请求重定向到其他位置, conn将接收重定向的响应。

To clarify, setInstanceFollowRedirects(true) only dictates whether HTTP redirects should be automatically followed by the HttpURLConnection instance. 为了澄清, setInstanceFollowRedirects(true)仅指示HTTP重定向是否应由HttpURLConnection实例自动跟随。 In your particular case, it seems that you want to redirect to servlets based on whether session is null (or some other condition based on your specific application logic). 在您的特定情况下,您似乎希望根据session是否为null (或基于您的特定应用程序逻辑的某些其他条件)重定向到servlet。

The correct (and more bug-proof solution) is to check for HTTP 3xx status code cases and manually handle the redirect. 正确(以及更多防错解决方案)是检查HTTP 3xx状态代码案例并手动处理重定向。 Here is a code snippet as an example: 这是一个代码片段作为示例:

if (responseStatusCode != HttpURLConnection.HTTP_OK) {
   switch(responseStatusCode){ 
      case HttpURLConnection.HTTP_MOVED_TEMP:
          // handle 302
      case HttpURLConnection.HTTP_MOVED_PERM:
          // handle 301
      case HttpURLConnection.HTTP_SEE_OTHER:                        
          String newUrl = conn.getHeaderField("Location");   // use redirect url from "Location" header field
          String cookies = conn.getHeaderField("Set-Cookie");       // if cookies are needed (i.e. for login)
          // manually redirect using a new connection 
          conn = (HttpURLConnection) new URL(newUrl).openConnection();
          conn.setRequestProperty("Cookie", cookies);
          conn.addRequestProperty("User-agent", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1"); 
      default:
          // handle default (other) case
   }
}

The above code is similar to what I use for my app's user login redirects, and I've found that it's very easy to debug. 上面的代码类似于我用于我的应用程序的用户登录重定向,我发现它很容易调试。 (In general, I handle HTTP status code cases manually in order to avoid bugs down the road.) (一般情况下,我会手动处理HTTP状态代码案例,以避免出现错误。)

Finally, I would recommend using a good JSON lib, such as json.org , to parse your responses. 最后,我建议使用一个好的JSON库,例如json.org来解析你的回复。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM