两个项目之间的通信

最近公司有一个之前已经上线的项目,因为这个项目中有一些报表经常搞死tom猫的原因,现在要将报表的部分拆分出来成为一个独立的系统,在专门的一个猫上跑。

  最终实现的一个效果如图所示:

  1.非报表业务访问主系统走的是7088服务器

  

  2.报表业务访问的是8082服务器上的信息

  

  注意:报表业务链接后面携带了一个参数

-------------------------------------------------------------------------------------------------------------------------------

  开始的一些准备

    1.报表系统是复制原系统一份,修改一下另一个系统的名字(不过用的只有报表的部分而已,别的没必要删除,太复杂了,牵扯到一些权限的问题,那些报表在那个角色下该不该显示等等)

    2.准备两个一样的tomcat(这两猫要在同一个机器上启动,所以这时候要注意端口的冲突问题,里面有关port的都要改一下)

    3.这两个项目不要放在同一个myeclipse或者eclipse中运行(原因:虽然可以正常启动访问,但是没法调试,两个除了名字不一样,其它都一样的项目在一个工作空间中的debug的时候,永远找的都是放在第一位的项目)

    4.在每个工具里安装准备好的猫即可

    5.复制相同的数据库,一个用于A系统,一个用于A_report系统

    6.在A系统的数据库的权限表中加入一个开关,用来标记哪些是报表的URL,这个用来在页面遍历出的URL中进行判断(boolean ipflag)

--------------------------------------------------------------------------------------------------------------------------------------------------

  开始具体的操作:(这里以A和A_report两个项目名为例)

    考虑的问题:(1).两个系统要保证是同一个用户登陆,A_report系统何时触发登陆,怎么登陆   (2).在A_report系统中要去掉登陆超时的一些类似验证   。。。。

    1.在A系统中添加一个properties属性文件,内容:reportIP=localhost:8082

    2.当A系统的侧边栏目加载的时候,报表部分的URL变成A_report系统的对应栏目的地址,比如上面第二张图中所示

     实现:(1)在加载A系统侧边栏目的action中入读取1中的IP属性文件,并声明一个变量,get,set 使其可以在前端页面中可以接收到,(其实是将需要的数据传递到前端,然后拼成相应的地址)


aciton类:

String fileName="reportIP.properties";
          String reportIP = "";
          try {
            Properties p = new Properties();    
            //InputStream is=new FileInputStream(fileName);
            InputStream in = PromissionAction.class.getClassLoader().getResourceAsStream(fileName);
            p.load(in);
            reportIP = p.getProperty("reportIP");
            System.out.println(reportIP);
            
        } catch (Exception e) {
            e.printStackTrace();
        }

//获取当前登陆账户的唯一标识,(将此标识传递到第二个系统中,第二个系统根据此值实现登陆)

SysAccounts so =  (SysAccounts) getRequest().getSession().getAttribute("SYSaccount");
            String opercode = so.getOpercode();
            
            getRequest().setAttribute("opercode", opercode);

前端页面判断:(用的是freemarker模版)

<#if p1.action?exists>      <!--这里的p1就是权限表promission-->

  <#if p1.ipflag==true>‘http://${reportIP}${p1.action?if_exists}?opercode=${opercode?if_exists}‘

  <#else>‘${p1.action?if_exists}

</#if>

        (2)至此,A系统的完成

    3.A_report系统:

      PS:在这个系统中有A系统的URL访问的时候,实现登陆,而且只能登陆一次,每次都登陆有影响

      (1)首先得在这个系统中定义一个拦截器,将此拦截器配置到这个系统的action 的xml文件中,然后每个报表的action都需要ref一下,这样一来,不管在A系统中先点那个报表的URL,都会实现第二个系统的登陆操作

public class ReportPamamInterceptor implements Interceptor {

    private SysAccounts accounts;

    public void destroy() {}

    public void init() {}

    public String intercept(ActionInvocation invocation) throws Exception {

        //从系统session中获取登陆用户信息
        HttpServletRequest req = ServletActionContext.getRequest();
        SysAccounts accounts = (SysAccounts) req.getSession().getAttribute("SYSaccount");

        //以下3句是得知那个action访问的,从而判断返回哪个报表
        String namespace = invocation.getProxy().getNamespace();
        String method = invocation.getProxy().getActionName();
        String url = namespace + "/" + method + ".do";

        //判断用户如果不为空,就不再登陆,直接返回具体的相应页面,在report.xml中的 <global-results>进行接收
        if (accounts != null) {
            return JudgeResult.toGoal(url);
        }

        HttpServletRequest request = ServletActionContext.getRequest();
        HttpSession session = request.getSession();

        String opercode = request.getParameter("opercode");
        accounts = new SysAccounts();
        accounts.setOpercode(opercode);

        session.setAttribute("accounts", accounts);
        //用于在登陆页面进行判断跳转的报表
        session.setAttribute("url", url);
        return "goLogin";
    }

}

xml文件中配置:

<package name="querycardinfo" namespace="/unionfb/report/querycardinfo" extends="default">

        <!-- 新增拦截器,作用是 当第一个系统访问此action的时候触发拦截器,拦截器接收第一个系统传递的值 -->
        <interceptors>
            <interceptor name="reportPamamInterceptor"
                class="com.zframework.system.interceptor.ReportPamamInterceptor">
            </interceptor>
            <!-- 拦截器栈 -->
            <interceptor-stack name="mydefault">
                <interceptor-ref name="defaultStack" />
                <interceptor-ref name="reportPamamInterceptor" />
            </interceptor-stack>
        </interceptors>
       <!-- 定义全局的,拦截器返回之后跳转到本系统进行登陆操作  -->
        <global-results>
            <!-- 没有登陆的时候执行-->
            <result name="goLogin" type="redirect">/Login.do</result>

            <!-- 已经登陆跳转   拦截器中检测到用户已经登陆,就不再做登陆操作,直接在这里返回具体的相应页面 -->
            <result name="/unionfb/report/querycardinfo/cro.do" type="redirect">/unionfb/report/querycardinfo/cro1.do</result>
        </global-results>

        <!-- 第二个系统对第一个系统的接应点 -->
        <action name="cro" class="">  //这里的class属性不能丢,这个action只是一个接应点,触发拦截器的作用是拦截器触发之后判断第二个系统是否已经登陆,
            <interceptor-ref name="reportPamamInterceptor"/>
        </action>
        <action name="cro1" class="queryCardAction" method="cro" >
           <result name="success">/templates/unionfb/report/card/query.html</result>
           <result name="error" type="dispatcher">/templates/common/message.html</result>

      (2)定义一个普通的Java类进行判断

public class JudgeResult {
    // 注意:以下的路径不是地址,仅是一个标记而已
    public static String toGoal(String url) {

        switch (url) {

        // 网店交易汇总表
        case "/report/wdsellcardquery.do":
            return "/report/wdsellcardquery.do";

                ......

      (3)A系统每次的URL都会触发这个拦截器,所以在拦截器中判断;如果已经登陆了根据JudgeResult.toGoal(url)判断直接跳到<global-results>的result返回

      (4)如果没有登陆,那么跳转到A_report的登陆action中,再在此调用返回JudgeResult.toGoal(url)结果

------------------------------------------------------------------------over-----------------------------------------------------------------------------------

这种做法比较low,如果大家有比较好的想法,可以交流下。

    

时间: 2024-08-01 22:43:53

两个项目之间的通信的相关文章

两个页面之间的通信

今天要给大家说的是两个不同页面之间的通信,通过一个拖拽demo来模拟: 首先,写好基础的拖拽代码: <script> window.onload = function() { var oDiv = document.getElementById('div'); oDiv.onmousedown = function(ev) { var ev = window.event || ev; var disX = ev.clientX - oDiv.offsetLeft; var disY = ev.

两个控制器之间的通信

//A控制器中 - (void)toDo{ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(nearbyToRootVcCommunication) name:@"nearbyToRootVcCommunication" object:nil]; } //当B控制器中的viewDidLoad方法调用时,此方法也会被触发 -(void)nearbyToRootVcCommunication

pyton 编写脚本检测两台主机之间的通信状态,异常邮件通知

最近客户有一个需求要检测两台服务器之间的通信状态.要是通信是失败就需要邮件通知相关人.本来想用shell来实现,shell脚本ping 对端服务器很简单,但是shell的邮件发送比较麻烦,于是使用python实现并且用smtplib模块可以快速实现邮件的发送. 功能如下:1秒钟ping一次目标地址.代码中把你的邮箱改为自己的就可以, 代码: #coding:utf-8 import socket import smtplib import email.MIMEText import email.

Android中两个Activity之间简单通信

在Android中,一个界面被称为一个activity,在两个界面之间通信,采用的是使用一个中间传话者(即Intent类)的模式,而不是直接通信. 下面演示如何实现两个activity之间的通信. 信息的发起者为Test,接收者为Target,代码如下: Test类: 1 package com.example.testsend; 2 3 import android.content.Intent; 4 import android.support.v7.app.AppCompatActivit

同一个Tomcat部署两个project之间的通信问题

同一个tomcat下的两个project是无法通信的. 同一个tomcat中的project能互相调用吗 启动一个tomcat部署多个项目,那么每个项目算是一个线程还是进程呢?

手动创建Maven项目并建立两个项目之间的依赖关系

用命令行快速建立maven项目 -> mvn:archetype:generate -> 直接回车或者自己输入你想生成的 -> groupId ->artifactId ->如果有默认值回车即可 最后 y 确认创建 我们看下他的目录结构 项目名: src ->main ->java ->test ->java pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0"

[ActionScript 3.0] 两个AIR之间的通信示例LocalConnection

发送方AIR程序: package { import flash.display.DisplayObjectContainer; import flash.display.Sprite; import flash.events.MouseEvent; import flash.events.StatusEvent; import flash.net.LocalConnection; import flash.text.TextField; /** * @author Frost.Yen * @E

两个java项目之间的通讯

两个Java项目,他们之间进行信息的通信 前提:必须知道要通信的java项目(接收请求方)的服务器的IP地址和访问路径. 其实两个java项目之间的通信还是使用HTTP的请求.主要有两种方式: ①使用apache的HttpClient方式. ②使用JDK自带的java.NET包下的HttpURLConnection方式. HttpURLConnection方式: HttpURLConnection传递请求常用的有两种方式:POST和GET方式.使用setRequestMethod()方法设置传递

两个iframe之间的异步通信

艾伦说过,一切学习都是从模仿开始,我也不例外.下面我要说的是两个页面之间的通信问题. 假设现有a.html 需要与b.html进行数据交互,a通过iframe加载b.html a.html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> </head> <body> <iframe src="b.html" style=&quo