写这个玩意儿就是想练练手, 用户需要登陆才能在线聊天,不要依赖数据库, 不需要数据库的操作, 所有的数据都是保存在内存中, 如果服务器一旦重启,数据就没有了;
登录界面:
聊天界面:
左侧是在线的用户列表, 右侧是聊天的内容, 内容的格式为 “作者 : 内容”;
点击button可以发布聊天信息;
使用的是spring搭建的框架,基于tomcat的服务器;
web.xml的配置如下:
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
index.htm
test
org.springframework.web.servlet.DispatcherServlet
1
test
*.htm
org.springframework.web.context.ContextLoaderListener
CharacterEncodingFilter
com.nono.Filter.CharacterEncodingFilter
encoding
UTF-8
SecurityServlet
com.nono.SecurityServlet
SecurityServlet
*.htm
contextConfigLocation
/WEB-INF/test-servlet.xml
View Code
conteConfigLocation的配置为:
.jsp
View Code
整个项目的结构为一个主路由, 四个po层, 两个过滤器:
界面的用户列表和用户内容列表用了ajax刷新, 感觉不错的说:
String basePath= request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>
loginheight:100%;
}
.bg{
background:url(imgs/bg.jpeg);
}
list
- name
- name
- name
- name
content
haha:
say someting
haha:
say someting
enter text
Submit
$.post("chat.htm", "content="+ $("#answer").val(), function(data) {
console.log(data);
});
});functionGet(url , el, fn) {this.post = function() {
$.post(url,function(data) {
data=JSON.parse(data);var html = "";
$.each(data,function(i, e) {
html+=fn(i,e);
});
$(el).html( html );
});
};
};
(function() {var list = new Get("getList.htm", "#list", function(i, e) {return "
" + e.name + "";});var content = new Get("getContent.htm", "#con", function(i, e) {return "
"+ e.name +" : "+ e.content +"
";});
setInterval(function() {
list.post();
content.post();
},1000);
})();
View Code
权限控制的话我们可以用到fileter:
packagecom.nono;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;importcom.nono.po.User;public class SecurityServlet extends HttpServlet implementsFilter {private static final long serialVersionUID = 1L;public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throwsIOException, ServletException {
HttpServletRequest request=(HttpServletRequest)arg0;
HttpServletResponse response=(HttpServletResponse) arg1;
HttpSession session=request.getSession();
User user= (User) session.getAttribute("user");
String url=request.getRequestURI();//如果用户信息不是空的, 或者要访问的是登陆的界面(get,post的方式包含了login字符串);
if( user!=null || url.indexOf("login")>-1) {
arg2.doFilter(arg0, arg1);return;
}else{//余下的全跳到登陆界面
response.sendRedirect(request.getContextPath() + "/login.htm");return;
}
}public void init(FilterConfig arg0) throwsServletException {
}
}
View Code
路由控制和服务放到了一起, 因为权限控制使用过滤器处理, 所以在路由里面我们就不用关心用户的消息, 只要处理业务逻辑就好了:
packagecom.nono.Controller;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.Vector;importjavax.jms.Session;importjavax.print.DocFlavor.STRING;importjavax.print.attribute.HashAttributeSet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;importnet.sf.json.JSONArray;importorg.omg.CORBA.PUBLIC_MEMBER;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;importorg.springframework.web.bind.annotation.ResponseBody;importcom.nono.po.Content;importcom.nono.po.Contents;importcom.nono.po.User;importcom.nono.po.Users;
@Controllerpublic classMainController {//用户和用户组;
@Autowired
Users users;
@Autowired
Contents contents;
@RequestMapping(value="login", method=RequestMethod.GET)publicString login (HttpServletRequest request) {return "login";
}
@RequestMapping(value="login", method=RequestMethod.POST)publicString loginPOST ( HttpServletRequest request, HttpServletResponse response ) {
String string= "login";
String name= (String) request.getParameter("name");
Boolean flag= true;//如果名字不是空的话;
if( !name.equals("") ) {
Vector vector=users.getList();for(int i=0; i< vector.size(); i++) {
User user=(User) vector.elementAt(i);if( user.getName().equals( name ) ) {
flag= false;
};
};
};//用户名不存在
if( flag ) {
User user= newUser();
user.setName( name );
HttpSession session= request.getSession(true);//设置Session的过期时间为10分钟
session.setMaxInactiveInterval(600);//设置seesion中的用户信息;
session.setAttribute("user", user);//添加用户;
users.addUser( user );//加入的提示;
Content content = newContent();
content.setName( name );
content.setContent("enter the chat room!");
contents.addContent( content );
string= "chat";returnstring;
}else{//用户名已经存在
request.setAttribute("info", "用户名已经存在1");
string= "login";returnstring;
}
}
@RequestMapping(value="chat", method=RequestMethod.GET)publicString main (HttpServletRequest request) {
String string= "chat";returnstring;
}
@RequestMapping(value="chat", method=RequestMethod.POST)
@ResponseBodypublicString chat(HttpServletRequest request) {
String string= (String) request.getParameter("content");
HttpSession session=request.getSession();//设置seesion中的用户信息;
User user = (User) session.getAttribute("user");
String name=user.getName();
Content content= newContent();
content.setName( name );
content.setContent( string );
contents.addContent( content );return "true";
}
@RequestMapping(value="getList", method=RequestMethod.POST, produces = "text/html;charset=UTF-8")
@ResponseBodypublicString getList( HttpServletRequest request) {returnJSONArray.fromObject( users.getList() ).toString();
}
@RequestMapping(value="getContent", method=RequestMethod.POST, produces = "text/html;charset=UTF-8")
@ResponseBodypublicString getArrayList() {
ArrayList list=(ArrayList) contents.getContents();
ArrayList result= newArrayList();for( int i= 0; i< list.size(); i++) {
HashMap hashMap = newHashMap();
hashMap.put("name", ((Content)list.get(i)).getName());
hashMap.put("content", ((Content)list.get(i)).getContent());
result.add( hashMap );
};returnJSONArray.fromObject( result ).toString();
}
}
View Code
有哪位大神告诉我为什么中文各种乱码, 在界面中的utf-8也设置, @ResponseBody的也设置了, 还是乱码, encodeURIComponent过的也是乱码, 坑爹啊;