首页 » Java » Servlet跨域请求Servlet实现解决方案

Servlet跨域请求Servlet实现解决方案

 

一.需求分析

当前项目的Servlet访问外部项目的Servlet服务,并将结果返回到当前项目的Servlet中进行业务处理,最后将结果返回到前台界面。

二.演示环境

1.Tomcat 6.0

2.JDK1.8.0_111

3.Java+Jquery+Maven+Servlet2.5+Httpclient

三.解决方案

JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
    <script type="text/javascript">
        /*
         * 需求说明:
         * 当前项目的Servlet访问外部项目的Servlet服务,
         * 并将结果返回到当前项目的Servlet中进行业务处理,最后将结果返回到前台界面。
         */
        function goServlet(){
            // 这里url_web是当前项目的Servlet。
            var url_web="http://localhost:8080/servletJavaDemo/appServlet?
                param=hi";
            var form=document.forms.item(0);
            form.action=url_web;
            form.method="post";
            form.submit();
        }
    </script>
  </head>
  <body>
	  <form>
	      <input type="button" value="Servlet调用" onclick="goServlet();"/><br/>
	      <h1>Result</h1>
	      <h2 style="color:red">${result}</h2>
	  </form>
  </body>
</html>

Java

业务调用端实现

package cn.xiangquba.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.methods.GetMethod;

public class appServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    public appServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
        String param=request.getParameter("param");
        if(param!=null && "hi".equalsIgnoreCase(param)) {
            // 用来存储最终的返回结果
            String result="";
            HttpClient httpClient=new HttpClient();
            // 模拟业务、进行循环请求调用
            for (int i = 0; i < 8; i++) {
                // servletURL为外部域下的Servlet、
                // 我这里用当前项目下的Servlet进行演示,实际项目中根据需求进行修改。
              String servletURL="http://localhost:8080/servletJavaDemo/
                     crossDomainServlet?param="+param;
              HttpMethod httpMethod=new GetMethod(servletURL);
              httpClient.executeMethod(httpMethod);
              result=result+httpMethod.getResponseBodyAsString()+"<br/>";
            }
            request.setAttribute("result", result);
            request.getRequestDispatcher("index.jsp").forward(request,response);
			
        }
    }

    protected void doPost(HttpServletRequest request, 
        HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
    }

}

业务被调用端实现

package cn.xiangquba.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.lang.StringUtils;

public class crossDomainServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public crossDomainServlet() {
        super();
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
            String param=request.getParameter("param");
            if(StringUtils.isNotEmpty(param)) {
                param=param.replaceAll("hi", "Hello World Xiangquba.cn!");
                response.getOutputStream().print(param);
	    }
        }
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns="http://java.sun.com/xml/ns/javaee" 
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name>servletJavaDemo</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>crossDomainServlet</display-name>
    <servlet-name>crossDomainServlet</servlet-name>
    <servlet-class>cn.xiangquba.servlet.crossDomainServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>crossDomainServlet</servlet-name>
    <url-pattern>/crossDomainServlet</url-pattern>
  </servlet-mapping>
  <servlet>
    <description></description>
    <display-name>appServlet</display-name>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>cn.xiangquba.servlet.appServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/appServlet</url-pattern>
  </servlet-mapping>
</web-app>

四.Demo下载

链接:http://pan.baidu.com/s/1skSu5Ud 密码:s2fs

五.总结

上篇文章《ajax跨域请求Java实现解决方案》介绍了前端跨域请求外部Servlet,这篇文章主要介绍的是通过后端Servlet调用外部Servlet并对返回的结果进行业务处理,两篇文章的介绍都是基于业务需求的限定前提,才提供相应的解决方案。实际工作中读者可以根据自己的实际情况进行做相应的处理。

原文链接:Servlet跨域请求Servlet实现解决方案,转载请注明来源!

0