业务由于业务需求,存在两套项目,一套是路由中心,一套是业务系统.
现在存在问题是,路由中心集成了微信公众号与小程序模块功能,业务系统部署了多套服务.
现在需要通过调用路由中心将接口重新路由到指定的业务系统中
需要处理的问题将小程序,公众号用户信息与业务系统做绑定
将路由中心的接口与业务系统的接口判断出来
通过用户信息找到的业务系统服务,分发到对应的业务系统中
公众号用户信息与业务系统做绑定处理步骤
业务系统存在手机号,如果用户注册将手机号发送给路由中心记录
将路由中心的接口与业务系统的接口判断处理步骤1.获取路由中心系统中接口映射
private static list<string> urls = new arraylist<>(); @resource private webapplicationcontext applicationcontext; @override public void init(filterconfig filterconfig) throws servletexception { applicationcontext .getbean(requestmappinghandlermapping.class) .gethandlermethods() .foreach((k, v) -> { k.getpatternscondition().getpatterns().stream().foreach(s-> urls.add(s)); }); log.info("过滤器初始化"); }
2.获取请求接口路径
httpservletrequest request = (httpservletrequest) servletrequest; httpservletresponse response = (httpservletresponse) servletresponse; string requestname = request.getrequesturi();
3.判断是否是路由中心的接口
if (urls.contains(requestname)) { //系统接口 chain.dofilter(servletrequest, servletresponse); } else { //业务系统接口 需要代理// 代理请求 responseentity<string> redirect = routerservice.redirect(request, response, "xxx", "xxx"); //设置将字符以"utf-8"编码输出到客户端浏览器 response.setcharacterencoding("utf-8"); //通过设置响应头控制浏览器以utf-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码 response.setheader("content-type", "application/json; charset=utf-8"); response.getwriter().write(redirect.getbody()); }
全部代码import com.jyw.router.miniapp.service.irouterservice;import lombok.extern.slf4j.slf4j;import org.springframework.context.annotation.configuration;import org.springframework.http.responseentity;import org.springframework.web.context.webapplicationcontext;import org.springframework.web.servlet.mvc.method.annotation.requestmappinghandlermapping;import javax.annotation.resource;import javax.servlet.*;import javax.servlet.annotation.webfilter;import javax.servlet.http.httpservletrequest;import javax.servlet.http.httpservletresponse;import java.io.ioexception;import java.util.arraylist;import java.util.list;/** * @author 沈峻 * @classname routerfilter * @description todo * @date 2023/4/20 12:23 **/@configuration@webfilter(urlpatterns = "/*", filtername = "router")@slf4jpublic class routerfilter implements filter { private static list<string> urls = new arraylist<>(); @resource private webapplicationcontext applicationcontext; @resource private irouterservice routerservice; @override public void init(filterconfig filterconfig) throws servletexception { applicationcontext.getbean(requestmappinghandlermapping.class).gethandlermethods().foreach((k, v) -> { k.getpatternscondition().getpatterns().stream().foreach(s-> urls.add(s)); }); log.info("过滤器初始化"); } @override public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain chain) throws ioexception, servletexception { httpservletrequest request = (httpservletrequest) servletrequest; httpservletresponse response = (httpservletresponse) servletresponse; string requestname = request.getrequesturi(); /*顺手解决跨域问题*/ response.setheader("access-control-allow-origin", "*"); response.setheader("access-control-allow-methods", "post, get, options, delete"); response.setheader("access-control-max-age", "3600"); response.setheader("access-control-allow-headers", "x-requested-with"); log.info(requestname); if (urls.contains(requestname)) { chain.dofilter(servletrequest, servletresponse); } else {// 代理请求 responseentity<string> redirect = routerservice.redirect(request, response, "http://192.168.2.18/api", "/router"); //设置将字符以"utf-8"编码输出到客户端浏览器 response.setcharacterencoding("utf-8"); //通过设置响应头控制浏览器以utf-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码 response.setheader("content-type", "application/json; charset=utf-8"); response.getwriter().write(redirect.getbody()); } log.info("--------------------------------------------------------"); } @override public void destroy() { filter.super.destroy(); }
以上就是springboot过滤器怎么实现项目内接口过滤的详细内容。