⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chat.java

📁 这是一个基于AJAX的聊天室程序。它在DWR例子的基础上加以改进增加一些新的功能包括emoticon(表情),bbcode,消息持久化,粘性信息,自动分解url和image链接。在线Demo:http
💻 JAVA
字号:
package org.ellab.elchat;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.javabb.bbcode.ProcessBBCode;

import uk.ltd.getahead.dwr.ExecutionContext;

/**
 * The main DWR interface for the chating logic.
 */
public class Chat {
    //private static Log log = LogFactory.getLog(Chat.class);

    private static LinkedList messages;
    private static LinkedList stickyMessages;
    private static MessageDatabase messageDatabase;
    private static ChatConfig config = ChatConfig.getInstance();

    // for apache mod_proxy
    private static final String HTTP_HEADER_FORWARDED_FOR = "x-forwarded-for";
    private static final String IMG_SRC_PREFIX = "___IMAGE_SRC_PREFIX___";
    private static final String MATCH_URL = "[-:\\w\\.]+(/([-:/?~!@#$%^&*()-_=+\\w\\.]*";

    static void init(String persistFile) {
        if (persistFile != null && persistFile.trim().length() > 0) {
            messageDatabase = MessageDatabase.load(persistFile);
            messages = messageDatabase.getMessages();
            stickyMessages = messageDatabase.getStickyMessages();
        }
        else {
            messages = new LinkedList();
            stickyMessages = new LinkedList();
        }
    }

    public List addMessage(String user, String text, boolean preview, boolean enableEmotIcon, boolean enableImage,
            boolean enableBBCode) {
        if (text != null && text.trim().length() > 0) {
            text = text.trim();

            if (!Command.process(text, this, config)) {
                if (config.isSuspend()) {
                    return null;
                }

                String ip = getRemoteAddr(ExecutionContext.get().getHttpServletRequest());

                Message message = createMessage(ip, user, text, enableEmotIcon, enableImage, enableBBCode);

                messages.addFirst(message);
                while (messages.size() > config.getLimit()) {
                    removeLastMessage();
                }

                persistMessage();
            }
        }

        return getMessages();
    }

    Message createMessage(String ip, String user, String text, boolean enableEmotIcon, boolean enableImage,
            boolean enableBBCode) {

        String newUser;
        String plainUser;
        String newText = text;
        String plainText;

        if (newText.length() > config.getMsgLength()) {
            newText = newText.substring(0, config.getMsgLength());
        }

        newUser = encodeHTML(user);
        if (config.isEnableHtmlEscape()) {
            newText = encodeHTML(newText);
        }

        plainUser = newUser;
        plainText = newText;

        //BBCode is disabled until find a releasd bbcode library
        if (enableBBCode) {
            ProcessBBCode bbcode = new ProcessBBCode();
            bbcode.setAcceptBBCode(true);
            bbcode.setAcceptHTML(true);
            newText = bbcode.preparePostText(newText);
        }

        if (config.isEnableImage() && enableImage) {
            // image
            // replace http to PREFIX to skip http replacement
            newText = (newText + " ").replaceAll(
                    "http(s?://" + MATCH_URL + ")?\\."
                            + "(([jJ][pP][eE]?[gG])|([gG][iI][fF])|([pP][nN][gG])|([bB][mM][pP])|([tT][iI][fF]?[fF]))"
                            + "))(\\s|<br\\/?>)", "<img src='" + IMG_SRC_PREFIX + "$1' border='0'/>").trim();
        }

        if (config.isEnableUrl()) {
            // http(s)://
            newText = (newText + " ").replaceAll("(https?://" + MATCH_URL + "))?)(\\s|<br\\/?>)",
                    "<a href='$1' target='_blank'>$1</a>$4").trim();

            // news://
            newText = (newText + " ").replaceAll(
                    "(news://" + MATCH_URL + "))?)(\\s|<br\\/?>)",
                    "<a href='http://ellab.org:8080/elnews/readNews.do"
                            + "?formAction=readNews&host=&submit=Submit&showImage=on&showMime=on&url=" + "$1"
                            + "' target='_blank'>$1</a>$4").trim();
        }

        if (config.isEnableImage() && enableImage) {
            // replace back PREFIX to http
            newText = newText.replaceAll("<img src='" + IMG_SRC_PREFIX, "<img src='http");
        }

        if (config.isEnableMsgEmotIcon() && enableEmotIcon) {
            newText = EmotIcon.process(newText);
        }
        if (config.isEnableUserEmotIcon()) {
            newUser = EmotIcon.processUserEmot(newUser.toLowerCase());
        }

        return new Message(user, newUser, plainUser, ip, text, newText, plainText);
    }

    void setSticky(long messageId) {
        for (Iterator it = messages.iterator(); it.hasNext();) {
            Message msg = (Message) it.next();
            if (msg.getId() == messageId) {
                Message newMsg = msg.copyTo();
                newMsg.setSticky(true);
                stickyMessages.addFirst(newMsg);

                persistMessage();
                return;
            }
        }
    }

    void removeSticky(long messageId) {
        for (Iterator it = stickyMessages.iterator(); it.hasNext();) {
            Message msg = (Message) it.next();
            if (msg.getId() == messageId) {
                msg.setSticky(false);
                stickyMessages.remove(msg);
                messages.addLast(msg);

                persistMessage();
                return;
            }
        }
    }

    void removeFirstMessage() {
        if (messages.size() > 0) {
            messages.removeFirst();
        }
    }

    void removeLastMessage() {
        if (messages.size() > 0) {
            messages.removeLast();
        }
    }

    void clearMessage() {
        messages.clear();
    }

    List getNonStickyMessage() {
        return messages;
    }

    void clearSticky() {
        stickyMessages.clear();
    }

    private static String encodeHTML(String s) {
        s = s.replaceAll("&", "&amp;");
        s = s.replaceAll("<", "&lt;");
        s = s.replaceAll(">", "&gt;");
        s = s.replaceAll("\"", "&quot;");
        s = s.replaceAll("(\r\n|\n\r|\n|\r)", "<br/>");

        return s;
    }

    public List getMessages() {
        HttpServletRequest request = ExecutionContext.get().getHttpServletRequest();
        HttpSession session = request.getSession();
        if (session != null) {
            String sessionId = session.getId();
            String ip = getRemoteAddr(request);
            SessionMap.access(sessionId, ip);
        }

        if (config.isSuspend()) {
            throw new SuspendException();
        }
        List list = new ArrayList();
        list.addAll(messages);
        list.addAll(stickyMessages);

        return list;
    }

    public List getUserList(String user) {
        HttpSession session = ExecutionContext.get().getHttpServletRequest().getSession();

        if (session != null) {
            String sessionId = session.getId();
            SessionMap.setSessionUser(sessionId, user);
        }
        return SessionMap.getUserList();
    }

    private void persistMessage() {
        if (messageDatabase != null) {
            messageDatabase.persist();
        }
    }

    private static String getRemoteAddr(HttpServletRequest request) {
        String addr = request.getHeader(HTTP_HEADER_FORWARDED_FOR);
        if (addr == null || addr.length() == 0 || addr.trim().length() == 0) {
            addr = request.getRemoteAddr();
        }

        return addr;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -