该项目为web项目,采用的AJAX+API方式进行数据交互,为了避免AJAX跨域,H5端采用AJAX请求数据时候,JAVA代码进行拦截,并请求到另外一个域名的接口。

流程:
1、在web.xml里面注册一个LoginFilter,用来监听和拦截所有web的请求。
2、在web.xml里面注册一个Servlet,将1中的拦截到的数据需要请求API接口的转发到Servlet中。
3、根据Servlet中的GET和POST请求来对不同的 ajax请求做http请求。
为什么要采用中间层转发?
个人认为:当第三方API出现问题的时候,可以在自己的中间层做一些处理,不会对前端造成影响,做到业务隔离。

比如:调用第三方的校验手机号码归属地的接口,如果出现挂掉的情况,可以在中间层立马切换到另外一个第三方通道

工程目录结构如下图所示:
InitialServlet 用来初始化Log4J的配置
LoginFilter   用来拦截所有的web中的请求
CookieCallBack  回调接口
MiddleServlet  转发请求其他域的API的Servlet   

下面发送一个ajax的请求:
        function create_qrcode(){ajax({type:'GET',url : "/api/user/get_login_barcode",                success : function(response){var rs = eval("("+response+")");if(rs.code == "0"){                        xxxxxxxx}}});        } 

然后在LoginFilter中进行拦截处理,代码如下:

import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;/*** 登录过滤器** @author zhuwenjun 20140506**/
public class LoginFilter implements Filter {@Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest req, ServletResponse response, FilterChain chain) throws IOException,ServletException {HttpServletRequest request = (HttpServletRequest) req;response.setContentType( "text/html; charset=utf-8" );response.setCharacterEncoding( "utf-8");//得到请求的URIString url=request.getRequestURI();//因为所有的API请求都会带 api的字符串,请求页面的路径不会携带这个参数,在这里做校验,如果是API的请求就直接转发到MiddleServlet中if(url.contains( "api/")){//将请求的参数给设置过去req.setAttribute( "path", url);req.getServletContext().getRequestDispatcher( "/servlet/MiddleServlet" ).forward(req, response);} else{chain.doFilter(req, response);return;}}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}}
MiddleServlet中的处理流程:
1、先从HttpServletRequest 中得到请求的url,然后将其他域名和这个url拼接成完整的API请求的URL。
2、再从HttpServletRequest 中得到请求的cookie(登录之后才会有cookie)
3、从HttpServletRequest  中得到请求的流(POST才有此步骤) 
4、HTTP请求API完整的URL(在请求之前,对http进行cookie设置)
5、API请求登录接口之后会返回token,将token设置到HttpServletResponse 中去,这样H5端和中间层建立了登录授权关系,而中间层和API建立了登录授权关系 
package com.baimi.walletadmin.pc;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.http.cookie.Cookie;
import org.apache.log4j.Logger;import com.baimi.walletadmin.pc.util.HttpsRequest;
import com.baimi.walletadmin.pc.util.RegexUtil;
import com.baimi.walletadmin.pc.util.Util;public class MiddleServlet extends HttpServlet {private Logger log_info = Logger.getLogger("base");@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String returnMsg = HttpsRequest.executeGet(getReqUrl(req), getCookie(req),new CookieUtil(req, resp));Util.returnMsg(resp, returnMsg);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String returnMsg = HttpsRequest.executePost(getReqUrl(req), getCookie(req),req.getInputStream(), new CookieUtil(req, resp));Util.returnMsg(resp, returnMsg);}private List<javax.servlet.http.Cookie> getCookie(HttpServletRequest request) {javax.servlet.http.Cookie[] requestCookies = ((HttpServletRequest) request).getCookies();List<javax.servlet.http.Cookie> cookies = new ArrayList<javax.servlet.http.Cookie>();if (requestCookies != null) {for (javax.servlet.http.Cookie cookie : requestCookies) {if (Constants.TOKEN_COOKIE_NAME.equals(cookie.getName()) || Constants.ZG_COOKIE_NAME.equals(cookie.getName())) {cookies.add(cookie);}}}return cookies;}//从HttpServletRequest中得到请求的url,并拼接成访问第三方API的urlprivate String getReqUrl(HttpServletRequest request) {String path = String.valueOf(request.getAttribute("path"));if (path.contains("api/")) {String retUrl = Constants.REQ_HOST + path.substring(path.indexOf("api/"), path.length());String params = request.getQueryString();if (RegexUtil.isEmpty(params)) {retUrl = retUrl + "?" + params;}return retUrl;} else {return null;}}//接口实现类class CookieUtil implements CookieCallBack {private HttpServletRequest request;private HttpServletResponse response;public CookieUtil(HttpServletRequest request, HttpServletResponse response) {super();this.request = request;this.response = response;}//登录第三方API之后要将第三方返回的cookie设置到HttpServletResponse中@Overridepublic void doLogin(List<Cookie> list) {for (Cookie cookie : list) {if (Constants.TOKEN_COOKIE_NAME.equals(cookie.getName()) || Constants.ZG_COOKIE_NAME.equals(cookie.getName())) {javax.servlet.http.Cookie cook = new javax.servlet.http.Cookie(cookie.getName(),cookie.getValue());cook.setPath("/");cook.setMaxAge(Constants.COOKIE_TIME);((HttpServletResponse) response).addCookie(cook);break;}}}//退出的操作需要将HttpServletResponse中的cookie给清空掉@Overridepublic void doLogout() {request.getSession().invalidate();// 清空sessionjavax.servlet.http.Cookie[] cookies = request.getCookies();if (cookies != null) {for (javax.servlet.http.Cookie cookie : cookies) {if (Constants.TOKEN_COOKIE_NAME.equals(cookie.getName())) {cookie.setMaxAge(0);cookie.setPath("/");response.addCookie(cookie);break;}}}}}
}
代码中的HttpsRequest  类可以参考demo中
下载地址: http://download.csdn.net/detail/q908555281/9729781

JAVA中间转发层开发相关推荐

  1. Java 持久层概述

    JDBC Java Database Connectivity 是一系列接口规范.Java 程序都是通过 JDBC 连接数据库的.然后通过其执行SQL.对数据库进行操作. DBC 只是 Sun 公司定 ...

  2. SpringBoot实现Java高并发秒杀系统之DAO层开发(一)

    SpringBoot实现Java高并发秒杀系统之DAO层开发(一) 秒杀系统在如今电商项目中是很常见的,最近在学习电商项目时讲到了秒杀系统的实现,于是打算使用SpringBoot框架学习一下秒杀系统( ...

  3. java业务类_Java_业务层开发

    业务是整个项目的核心,每一个业务的处理都是由控制层调用的(本次不考虑控制层,只考虑客户端直接调用业务层的形式),所以整个代码里业务层依然是一个标准,控制层要想取得业务层对象,一定也是依靠工厂类. 1. ...

  4. SpringBoot实现Java高并发秒杀系统之Service层开发(二)

    继上一篇文章:SpringBoot实现Java高并发秒杀系统之DAO层开发 我们创建了SpringBoot项目并熟悉了秒杀系统的表设计,下面我们将讲解一下秒杀系统的核心部分:Service业务层的开发 ...

  5. [零基础学JAVA]Java SE实战开发-37.MIS信息管理系统实战开发[JDBC](1)

    MIS信息管理系统实战开发之使用MySQL实现保存 开发背景 ID.姓名.年龄为公共信息,而学生有成绩,工人有工资 定义一个抽象类Person(ID.姓名.年龄),学生是其子类,有成绩,工人是其子类有 ...

  6. 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?

    2019独角兽企业重金招聘Python工程师标准>>> 今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制 ...

  7. 面试 Java 高级后端开发,要准备哪些知识点?

    由于我做了比较长时间的技术面试官,根据我的面试体会,不少同学收到面试后,什么准备也不会做,到时候就来了. 这样做的后果是:不知彼,不知己,每战必殆.哪怕侥幸面试成,工资一定会被压得很低. 其实公司肯花 ...

  8. canoe开发从入门到精通pdf_阿里技术官手写801页PDF《精通Java Web整合开发》

    基础篇 第1~3章为基础篇,重点讲解基于开源架构Java EE应用开发的优势及其开发运行环境的安装配置,同时对JSP技术体系也进行了详细介绍. 基础篇的主要内容包括: Java Web应用开发技术选用 ...

  9. java使用Crawler4j开发爬虫

    2019独角兽企业重金招聘Python工程师标准>>> 在爬虫开发中,常用的语言是python,但是也可以使用java来进行 开发,这样就可以利用java强大的库,下面就来介绍一下常 ...

最新文章

  1. lc171. Excel Sheet Column Number
  2. C和C++Everything教程的简介
  3. 学用MVC4做网站五:5.1添加文章
  4. mr利用mapjoin计算出每个部门的总工资以及部门名称
  5. Hadoop sqoop
  6. Silverlight 中文教程第四部分:使用 Style 元素更好地封装观感 (木野狐译)
  7. MyBatis入门让它跑起来
  8. 计算文件的hash值方法 | 使用powershell 以及 使用python
  9. matlab veristand,amesim Veristand matlab
  10. solr与zookeeper搭建solrcloud分布式索引服务实例
  11. AJAX框架大全 (AJAX Frameworks)
  12. 导入JasperReports坐标时无法下载com.lowagie:itext:jar:2.1.7.js6
  13. 三张图片无缝合成一张图片_怎样把两张照片连在一起合成一张照片
  14. cad net 绘制带圆弧的多段线
  15. Word 2016中给公式自动编号
  16. 【Python学习笔记】第一章基础知识:格式化输出,转义字符,变量类型转换,算术运算符,运算符优先级和赋值运算符,逻辑运算符,世界杯案例题目,条件判断if语句,猜拳游戏与三目运算符
  17. 基于matlab的光学薄膜特性分析,基于matlab的光学薄膜特性分析.doc
  18. 程序员适当来点经济头脑
  19. JavaScript 之 对象及其本身
  20. android ebusy,在Android中使用pjsip发送INVITE时出错:初始化媒体通道出错(PJ_EBUSY)...

热门文章

  1. typora修改为百度搜索引擎
  2. OSI七层参考模型是什么
  3. Android Mediaplayer连续播放没有声音的问题
  4. 147 completion机制基本概念
  5. house-robber-iii
  6. sergsawegfresrgerg
  7. 【PYTHON小项目】VCF文件转EXCEL文件方法详解(附QUOTED-PRINTABLE编解码)
  8. JAVA后端开发面试经典
  9. 36家科技巨头组建元宇宙标准论坛 被批为“纸老虎” 我们应该相信吗?
  10. 转行?小白?来看看这门和Java分庭抗礼的萌新语言!会的同学笑出了声!