相关疑难解决方法(0)

使用JSF/Java EE从数据库进行实时更新

我有一个应用程序在以下环境中运行.

  • GlassFish Server 4.0
  • JSF 2.2.8-02
  • PrimeFaces 5.1决赛
  • PrimeFaces Extension 2.1.0
  • OmniFaces 1.8.1
  • EclipseLink 2.5.2具有JPA 2.1
  • MySQL 5.6.11
  • JDK-7u11

有几个公共页面从数据库中延迟加载.一些CSS菜单显示在模板页面的标题上,如显示类别/子类别特征,最畅销,新到达等产品.

CSS菜单根据数据库中的各种产品类别从数据库动态填充.

这些菜单填充在每个页面加载上,这是完全没有必要的.其中一些菜单需要复杂/昂贵的JPA标准查询.

目前,填充这些菜单的JSF托管bean是视图范围的.它们都应该是应用程序作用域,在应用程序启动时只加载一次,并且只有在更新/更改相应数据库表(类别/子类别/产品等)中的某些内容时才更新.

我做了一些尝试来理解WebSokets(从未尝试过,对WebSokets来说是全新的),就像这样这个.他们在GlassFish 4.0上运行良好,但它们不涉及数据库.我仍然无法正确理解WebSokets的工作方式.特别是涉及数据库时.

在这种情况下,当更新/删除/添加到相应的数据库表时,如何通知关联的客户端并使用数据库中的最新值更新上述CSS菜单?

一个简单的例子很棒.

jsf java-ee websocket primefaces java-ee-7

29
推荐指数
2
解决办法
2万
查看次数

Websocket - httpSession返回null

我想在websocket handshake\session与HttpSession对象之间建立连接.

我使用了以下握手修改:

public class GetHttpSessionConfigurator extends ServerEndpointConfig.Configurator
{
@Override
public void modifyHandshake(ServerEndpointConfig config, 
                            HandshakeRequest request, 
                            HandshakeResponse response)
{
    HttpSession httpSession = (HttpSession)request.getHttpSession();
    config.getUserProperties().put(HttpSession.class.getName(),httpSession);
}
}
Run Code Online (Sandbox Code Playgroud)

正如本文所述: 在Web Socket @ServerEndpoint中从HttpServletRequest访问HttpSession

现在,由于某些原因在握手时,(HttpSession)request.getHttpSession()一直返回null.

这是我的客户端代码:

<!DOCTYPE html>
<html>
<head>
<title>Testing websockets</title>
</head>
<body>
<div>
    <input type="submit" value="Start" onclick="start()" />
</div>
<div id="messages"></div>
<script type="text/javascript">
    var webSocket = 
        new WebSocket('ws://localhost:8080/com-byteslounge-websockets/websocket');

    webSocket.onerror = function(event) {
        onError(event)
    };

    webSocket.onopen = function(event) {
        onOpen(event)
    };

    webSocket.onmessage = function(event) {
        onMessage(event)
    };

    function onMessage(event) {
        document.getElementById('messages').innerHTML 
            += '<br …
Run Code Online (Sandbox Code Playgroud)

session tomcat httpsession websocket

13
推荐指数
2
解决办法
6708
查看次数

在数据库中修改某些内容时,仅通过WebSockets通知特定用户

为了通过WebSockets通知所有用户,当在选定的JPA实体中修改某些内容时,我使用以下基本方法.

@ServerEndpoint("/Push")
public class Push {

    private static final Set<Session> sessions = new LinkedHashSet<Session>();

    @OnOpen
    public void onOpen(Session session) {
        sessions.add(session);
    }

    @OnClose
    public void onClose(Session session) {
        sessions.remove(session);
    }

    private static JsonObject createJsonMessage(String message) {
        return JsonProvider.provider().createObjectBuilder().add("jsonMessage", message).build();
    }

    public static void sendAll(String text) {
        synchronized (sessions) {
            String message = createJsonMessage(text).toString();

            for (Session session : sessions) {
                if (session.isOpen()) {
                    session.getAsyncRemote().sendText(message);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当修改选定的JPA实体时,会引发适当的CDI事件,该事件将由以下CDI观察者观察.

@Typed
public final class EventObserver {

    private EventObserver() {}

    public void …
Run Code Online (Sandbox Code Playgroud)

java-ee websocket real-time-updates java-ee-7

10
推荐指数
1
解决办法
5802
查看次数

带有Tomcat的JSR-356 WebSockets - 如何限制单个IP地址内的连接?

我制作了一个JSR-356 @ServerEndpoint,其中我想限制来自单个IP地址的活动连接,以防止简单的DDOS攻击.

请注意,我正在搜索Java解决方案(JSR-356,Tomcat或Servlet 3.0规范).

我尝试过自定义端点配置程序,但即使在HandshakeRequest对象中也无法访问IP地址.

如何在没有iptables等外部软件的情况下限制单个IP地址的JSR-356连接数?

java tomcat servlets websocket jsr356

6
推荐指数
1
解决办法
9428
查看次数