通过HTTP POST发送XML对象

时间:2012-03-16 14:47:35

标签: java xml servlets

我们是学生。 在我们的项目中,我们希望通过http post方法将xml块(基本上是saml断言)从一个服务器发送到另一个服务器。 任何人都可以帮助我们将XML对象从一个servlet发送到另一个servlet,其中每个servlet都驻留在java中的两台不同的计算机上。

/ *这里我们试图将xml对象(root)从一个servlet发送到另一个驻留在不同pc上的servlet ...但是调度程序方法在这种情况下不起作用。* /

public class sp1serv extends HttpServlet
{
public void doPost(HttpServletRequest req,HttpServletResponse resp) throws      ServletException,java.io.IOException
{
Connection c=null;
Statement s= null; 
ResultSet rs = null;
String d=null;
int flag=0;
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
Response response=null;
XMLObject root=null;
HttpSession session1=req.getSession();
System.out.println(session1.getAttribute("sAccessLevel"));
System.out.println(session1.getAttribute("sUserId"));
String eid=session1.getAttribute("sUserId").toString();
String[] str1 = {"response","attr",session1.getAttribute("sAccessLevel").toString(),      session1.getAttribute("sUserId").toString() };
String filename= eid.concat(".xml");
try {
response=SAMLProtocol.passResponse(str1);
root=SAMLSignature.passSignature(response,filename);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
req.setAttribute("SP1",root);
String abc="http://169.254.229.232:8080/sp_response_handler";
RequestDispatcher rd=getServletContext().getRequestDispatcher(abc);
rd.forward(req, resp);
break;
}
}
}
}}

/ *这个servlet用于检索xml对象(root)并解析它...在另一台服务器上。* /

public class sp1_response_handler extends HttpServlet {
private static final long serialVersionUID = 1L;
public sp1_response_handler() {
super();
// TODO Auto-generated constructor stub
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws    ServletException, IOException {
// TODO Auto-generated method stub
Response resp=null;
//XMLObject resp=null;
resp=(Response) request.getAttribute("SP1");
int result=0;
//SAMLSignature verification=null;
try {
result=SAMLSignature.verify(resp);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(result==1){
List attributeStatements = resp.getAssertions().get(0).getAttributeStatements();
for (int i = 0; i < attributeStatements.size(); i++)
{
List attributes = ((AttributeStatement) attributeStatements.get(i)).getAttributes();
for (int x = 0; x < attributes.size(); x++)
{
String strAttributeName = ((XMLObject) attributes.get(x)).getDOM().getAttribute("Name");
List<XMLObject> attributeValues = ((Attribute) attributes.get(x)).getAttributeValues();
for (int y = 0; y < attributeValues.size(); y++)
{
String strAttributeValue = attributeValues.get(y).getDOM().getTextContent();
System.out.println(strAttributeName + ": " + strAttributeValue);
}
}
}
response.sendRedirect("SP1.jsp");
}
else
{
System.out.println("NOT a Valid Signature");
}

}}

2 个答案:

答案 0 :(得分:0)

如果您使用的是弹簧,则可以使用RestTemplate。来自文档:

String uri = "http://example.com/hotels/1/bookings";
PostMethod post = new PostMethod(uri);
// create booking request content
String request = post.setRequestEntity(new StringRequestEntity(request));
httpClient.executeMethod(post);

if (HttpStatus.SC_CREATED == post.getStatusCode()) {
  Header location = post.getRequestHeader("Location");
  if (location != null) {
    System.out.println("Created new booking at :" + location.getValue());
  }
}

答案 1 :(得分:0)

这样的事情应该有效(参数为Map<String,String>):

            StringBuffer data = new StringBuffer();
            if (parameters != null && parameters.size() > 0) {
                for (Entry<String, String> e : parameters.entrySet()) {
                    if (data.length() > 0) {
                        data.append('&');
                    }
                    data.append(URLEncoder.encode(e.getKey(), "UTF-8")).append("=").append(URLEncoder.encode(e.getValue(), "UTF-8"));
                }
            }
            String parametersAsString = data.toString();
            // Send data
            URL local_url = new URL(url);
            URLConnection conn = local_url.openConnection();
            conn.addRequestProperty("Content-Type", "text/xml; charset=utf-8");
            conn.setDoOutput(true);
            OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
            wr.write(parametersAsString);
            wr.flush();
            break;