JAVA中间转发层开发
该项目为web项目,采用的AJAX+API方式进行数据交互,为了避免AJAX跨域,H5端采用AJAX请求数据时候,JAVA代码进行拦截,并请求到另外一个域名的接口。
比如:调用第三方的校验手机号码归属地的接口,如果出现挂掉的情况,可以在中间层立马切换到另外一个第三方通道
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 {}}
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;}}}}}
}
JAVA中间转发层开发相关推荐
- Java 持久层概述
JDBC Java Database Connectivity 是一系列接口规范.Java 程序都是通过 JDBC 连接数据库的.然后通过其执行SQL.对数据库进行操作. DBC 只是 Sun 公司定 ...
- SpringBoot实现Java高并发秒杀系统之DAO层开发(一)
SpringBoot实现Java高并发秒杀系统之DAO层开发(一) 秒杀系统在如今电商项目中是很常见的,最近在学习电商项目时讲到了秒杀系统的实现,于是打算使用SpringBoot框架学习一下秒杀系统( ...
- java业务类_Java_业务层开发
业务是整个项目的核心,每一个业务的处理都是由控制层调用的(本次不考虑控制层,只考虑客户端直接调用业务层的形式),所以整个代码里业务层依然是一个标准,控制层要想取得业务层对象,一定也是依靠工厂类. 1. ...
- SpringBoot实现Java高并发秒杀系统之Service层开发(二)
继上一篇文章:SpringBoot实现Java高并发秒杀系统之DAO层开发 我们创建了SpringBoot项目并熟悉了秒杀系统的表设计,下面我们将讲解一下秒杀系统的核心部分:Service业务层的开发 ...
- [零基础学JAVA]Java SE实战开发-37.MIS信息管理系统实战开发[JDBC](1)
MIS信息管理系统实战开发之使用MySQL实现保存 开发背景 ID.姓名.年龄为公共信息,而学生有成绩,工人有工资 定义一个抽象类Person(ID.姓名.年龄),学生是其子类,有成绩,工人是其子类有 ...
- 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
2019独角兽企业重金招聘Python工程师标准>>> 今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制 ...
- 面试 Java 高级后端开发,要准备哪些知识点?
由于我做了比较长时间的技术面试官,根据我的面试体会,不少同学收到面试后,什么准备也不会做,到时候就来了. 这样做的后果是:不知彼,不知己,每战必殆.哪怕侥幸面试成,工资一定会被压得很低. 其实公司肯花 ...
- canoe开发从入门到精通pdf_阿里技术官手写801页PDF《精通Java Web整合开发》
基础篇 第1~3章为基础篇,重点讲解基于开源架构Java EE应用开发的优势及其开发运行环境的安装配置,同时对JSP技术体系也进行了详细介绍. 基础篇的主要内容包括: Java Web应用开发技术选用 ...
- java使用Crawler4j开发爬虫
2019独角兽企业重金招聘Python工程师标准>>> 在爬虫开发中,常用的语言是python,但是也可以使用java来进行 开发,这样就可以利用java强大的库,下面就来介绍一下常 ...
最新文章
- lc171. Excel Sheet Column Number
- C和C++Everything教程的简介
- 学用MVC4做网站五:5.1添加文章
- mr利用mapjoin计算出每个部门的总工资以及部门名称
- Hadoop sqoop
- Silverlight 中文教程第四部分:使用 Style 元素更好地封装观感 (木野狐译)
- MyBatis入门让它跑起来
- 计算文件的hash值方法 | 使用powershell 以及 使用python
- matlab veristand,amesim Veristand matlab
- solr与zookeeper搭建solrcloud分布式索引服务实例
- AJAX框架大全 (AJAX Frameworks)
- 导入JasperReports坐标时无法下载com.lowagie:itext:jar:2.1.7.js6
- 三张图片无缝合成一张图片_怎样把两张照片连在一起合成一张照片
- cad net 绘制带圆弧的多段线
- Word 2016中给公式自动编号
- 【Python学习笔记】第一章基础知识:格式化输出,转义字符,变量类型转换,算术运算符,运算符优先级和赋值运算符,逻辑运算符,世界杯案例题目,条件判断if语句,猜拳游戏与三目运算符
- 基于matlab的光学薄膜特性分析,基于matlab的光学薄膜特性分析.doc
- 程序员适当来点经济头脑
- JavaScript 之 对象及其本身
- android ebusy,在Android中使用pjsip发送INVITE时出错:初始化媒体通道出错(PJ_EBUSY)...