[英]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.