java – 如何拦截和授权用户输入服务器

前端之家收集整理的这篇文章主要介绍了java – 如何拦截和授权用户输入服务器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
简短介绍:

我有一个[物理]模拟框架,曾经是一个单用户桌面版本.该框架用作工具包以实现例如教师在没有深入了解Java编程和/或特定数学的情况下构建各种模拟设置.最终,我们想到将一个客户端 – 服务器范例应用于框架,以允许多个客户端在使用相同的模拟时进行协作(=在所有客户端之间同步模拟).

一些额外的技术事实:

框架/模拟是基于MVC模式设计的.

如果客户端对模拟进行更改 – 例如通过移动滑块或鼠标拖动模拟元素通过Swing GUI – 这些更改必须由服务器授权才能应用于模拟(服务器必须小心)将更改分发给所有其他客户端,这些客户端也必须应用它们.

授权本身非常简单,并且基本上只决定时间戳是否应该接受更改(以避免由具有不同延迟的客户端导致的问题导致在[几乎]同时)对同一事物进行更改.

问题分别是问题:

我现在想知道检测(和拦截)用户输入(将它们传递给负责客户端 – 服务器通信的底层消息系统)的最优雅方法是什么?是否存在某种通常用于所描述场景的模式或最佳实践?

我主要关注的一个问题是避免引入新的约束,这些约束必须由使用框架来构建新内容(=模拟)的人员加以考虑.从这个意义上讲,我希望保持现有的模拟工作尽可能少的更改.

我认为可以解决的一个解决方

我想过引入一个新的界面,如:

public interface Synchronizable {
  public boolean appliesChanges();
}

在这种情况下,约束是任何类型的更改侦听器如果希望同步它们正在侦听的更改事件,则必须另外实现此接口.通过这样做,底层框架可以用代理对象替换实现Synchronizable的所有对象,代理对象负责验证与服务器的更改[事件](并且成功将事件转发给真正的更改侦听器).

‘applyChanges’方法背后的想法是,并非所有对更改侦听器的调用都会导致需要同步的更改.例如,Swing JSlider可能会在旋钮移动时生成事件,但是一旦释放旋钮(即’值不再调整’),更改侦听器的具体实现可能仅应用实际更改.发生在其间的更改事件不需要发送到服务器,因为它们无论如何都不会产生任何影响.这种方法既不方便也不特别漂亮,但我想不出以其他方式解决问题的其他任何可能性?!

除了最终用户必须明确考虑他们想要同步哪些事件(因此为所有特定侦听器声明和实现所提到的接口)的问题之外,剩下的一个问题是如何自动找出哪个特定的method负责处理任意类型的事件(以避免必须为每个可能的更改侦听器实现具体代理).

概述此问题的示例:

public interface SynchronizedChangeListener extends ChangeListener,Synchronizable {}
public interface SynchronizedPropertyChangeListener extends PropertyChangeListener,Synchronizable {}

public static void main(String[] args) {

  SynchronizedChangeListener scl = new SynchronizedChangeListener() {
    public void stateChanged(ChangeEvent e) {
      System.out.println("Hello world - SynchronizedChangeListener");
    }
    public boolean appliesChanges() {
      return true;
    }
  };
  SynchronizedPropertyChangeListener spcl = new SynchronizedPropertyChangeListener() {
    public void propertyChange(PropertyChangeEvent evt) {
      System.out.println("Hello world - SynchronizedPropertyChangeListener");
    }
    public boolean appliesChanges() {
      return true;
    }
  };
}

代理监听器如何知道对于PropertyChangeEvents,它必须调用’propertyChange’方法,而对于ChangeEvents,它必须调用’stateChanged’方法?反思是否能够解决这个问题?

期待您的投入 – 我会对您可能有的任何想法或任何有关此主题的文学重新指示感到高兴.

解决方法

在我看来,你有一个用户界面,用户可以提供一些输入.您有另一个运行物理模拟的模拟UI.只有在服务器授权后,才能将用户界面的输入提供给另一个用户界面.

到现在为止还挺好?

现在,您的Simulation UI应该最终等待来自服务器的事件.我在考虑这样的事情:

>准备一个XML,其中包含用户想要从用户ui进行的更改.>在tomcat服务器上实现一个简单的servlet(或struts)来解析此XML并回复使用该授权请求它的用户.响应也可以是XML格式.>通过队列将此授权提交回模拟UI.模拟UI应该在此队列上侦听任何放在其上的事件.>这将照顾单个用户场景.对于从服务器接收事件的多个用户,最简单的方法是轮询.在模拟UI之前在级别上实现计时器,该UI将轮询服务器.服务器可以使用最新更改进行响应.现在将其提供给模拟UI的队列.

猜你在找的Java相关文章