这篇博客是filter、listener和servlet技术的相关总结,实现了简单的显示在线人数、在线人详细信息、管理员踢人功能
下面是详细代码
web.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
<? xml version = "1.0" encoding = "UTF-8" ?> < web-app version = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> < display-name ></ display-name > < filter > < filter-name >character</ filter-name > < filter-class >cn.hncu.filter.CharacterFilter</ filter-class > < init-param > < param-name >charset</ param-name > < param-value >utf-8</ param-value > </ init-param > </ filter > < filter > < filter-name >login</ filter-name > < filter-class >cn.hncu.filter.LoginFilter</ filter-class > </ filter > < filter-mapping > < filter-name >character</ filter-name > < url-pattern >/*</ url-pattern > </ filter-mapping > < filter-mapping > < filter-name >login</ filter-name > < url-pattern >/servlet/*</ url-pattern > < url-pattern >/jsps/*</ url-pattern > < dispatcher >REQUEST</ dispatcher > < dispatcher >FORWARD</ dispatcher > </ filter-mapping > < listener > < listener-class >cn.hncu.listener.MySessionListener</ listener-class > </ listener > < servlet > < servlet-name >LoginServlet</ servlet-name > < servlet-class >cn.hncu.servlet.LoginServlet</ servlet-class > </ servlet > < servlet > < servlet-name >ShowServlet</ servlet-name > < servlet-class >cn.hncu.servlet.ShowServlet</ servlet-class > </ servlet > < servlet > < description >This is the description of my J2EE component</ description > < display-name >This is the display name of my J2EE component</ display-name > < servlet-name >KickOutServlet</ servlet-name > < servlet-class >cn.hncu.servlet.KickOutServlet</ servlet-class > </ servlet > < servlet > < description >This is the description of my J2EE component</ description > < display-name >This is the display name of my J2EE component</ display-name > < servlet-name >LoginOutServlet</ servlet-name > < servlet-class >cn.hncu.servlet.LoginOutServlet</ servlet-class > </ servlet > < servlet-mapping > < servlet-name >LoginServlet</ servlet-name > < url-pattern >/LoginServlet</ url-pattern > </ servlet-mapping > < servlet-mapping > < servlet-name >ShowServlet</ servlet-name > < url-pattern >/servlet/ShowServlet</ url-pattern > </ servlet-mapping > < servlet-mapping > < servlet-name >KickOutServlet</ servlet-name > < url-pattern >/servlet/KickOutServlet</ url-pattern > </ servlet-mapping > < servlet-mapping > < servlet-name >LoginOutServlet</ servlet-name > < url-pattern >/servlet/LoginOutServlet</ url-pattern > </ servlet-mapping > < welcome-file-list > < welcome-file >index.jsp</ welcome-file > </ welcome-file-list > </ web-app > |
index.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> < html > < head > < title >在线人信息管理</ title > </ head > < body > < h2 >在线人信息管理</ h2 > < h3 >会员登录</ h3 > < c:if test = "${ empty sessionScope.user.name}" var = "boo" > < form action='<c:url value = "/LoginServlet" ></ c:url >'> 姓名:< input type = "text" name = "name" >< br /> < input type = "submit" value = "登录" >< br /> </ form > </ c:if > < c:if test = "${!boo}" > 欢迎回来,${ sessionScope.user.name} < c:if test = "${ sessionScope.user.admin}" var = "bo" > 管理员 </ c:if > < c:if test = "${!bo}" > 会员 </ c:if > </ c:if > < br /> < c:if test = "${!boo}" var = "boo" > < a href='<c:url value = "/servlet/ShowServlet" />'>查看在线人信息</ a >< br /> < a href='<c:url value = "/servlet/LoginOutServlet" />'>安全退出</ a >< br /> </ c:if > </ body > </ html > |
/jsps/show.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> < html > < head > < title >在线人信息</ title > < style type = "text/css" > table { color: green; border: 1px solid blue; border-collapse: collapse; width: 500px; margin: auto; } td { border: 1px solid blue; } th { border: 1px solid blue; } body { text-align: center; } </ style > < meta http-equiv = "refresh" content = "3" > </ head > < body > < table > < tr > < th >姓名</ th > < th >上线时间</ th > < th >最后访问时间</ th > < th >ip</ th > < th >操作</ th > </ tr > < c:forEach items = "${requestScope.onlines}" var = "online" > < tr > < td > < c:if test = "${!empty online.user }" var = "boo" > ${online.user.name } </ c:if > < c:if test = "${empty online.user }" > 游客 </ c:if > </ td > < td >${online.createTime }</ td > < td >${online.lastAccessedTime }</ td > < td >${online.ip }</ td > < td > < c:if test = "${online.user!=sessionScope.user }" > < c:if test = "${!online.user.admin&&boo}" > < a href='<c:url value = "/servlet/KickOutServlet?id=${online.id }" />' >踢出</ a > </ c:if > </ c:if > </ td > </ tr > </ c:forEach > </ table > </ body > </ html > |
User.java(值对象)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package cn.hncu.domain; public class User { private String name; private boolean admin; public String getName() { return name; } public void setName(String name) { this .name = name; } public boolean isAdmin() { return admin; } public void setAdmin( boolean admin) { this .admin = admin; } @Override public String toString() { return "User [name=" + name + ", admin=" + admin + "]" ; } } |
MySessionListener.java(监听器)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
package cn.hncu.listener; import java.util.Collections; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class MySessionListener implements HttpSessionListener{ @Override public void sessionCreated(HttpSessionEvent se) { Map<String, HttpSession> onlines= (Map<String, HttpSession>) se.getSession().getServletContext().getAttribute( "onlines" ); if (onlines== null ){ onlines=Collections.synchronizedMap( new HashMap<String, HttpSession>()); //对map进行加上同步锁 se.getSession().getServletContext().setAttribute( "onlines" ,onlines); } onlines.put(se.getSession().getId(), se.getSession()); } @Override public void sessionDestroyed(HttpSessionEvent se) { Map<String, HttpSession> onlines= (Map<String, HttpSession>) se.getSession().getServletContext().getAttribute( "onlines" ); if (onlines.containsKey(se.getSession().getId())){ onlines.remove(se.getSession().getId()); } } } |
CharacterFilter.java(字符过滤器)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
package cn.hncu.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; public class CharacterFilter implements Filter { private String charset; @Override public void init(FilterConfig filterConfig) throws ServletException { charset=filterConfig.getInitParameter( "charset" ); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding(charset); response.setCharacterEncoding(charset); HttpServletRequest req=(HttpServletRequest) request; if (req.getSession().getAttribute( "ip" )== null ){ req.getSession().setAttribute( "ip" , req.getRemoteAddr()); } chain.doFilter(request, response); } @Override public void destroy() { } } |
LoginFilter.java(防止游客乱访问过滤器)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
package cn.hncu.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req=(HttpServletRequest) request; if (req.getSession().getAttribute( "user" )== null ){ ((HttpServletResponse)response).sendRedirect(req.getContextPath()+ "/index.jsp" ); return ; } chain.doFilter(request, response); } @Override public void destroy() { } } |
LoginServlet.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
package cn.hncu.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.hncu.domain.User; public class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name=request.getParameter( "name" ); User user=(User) request.getSession().getAttribute( "user" ); if (user== null &&name!= null &&name.trim().length()> 0 ) { //封装User user = new User(); user.setName(name); if (name.equals( "admin" )){ user.setAdmin( true ); } } request.getSession().setAttribute( "user" , user); response.sendRedirect(request.getContextPath()+ "/index.jsp" ); } } |
ShowServlet.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
package cn.hncu.servlet; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class ShowServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Map<String, HttpSession> onlines=(Map<String, HttpSession>) request.getServletContext().getAttribute( "onlines" ); List<Map<String, Object>> list= new ArrayList<Map<String,Object>>(); //吧Online封装成list if (onlines!= null ) { Iterator<HttpSession> it = onlines.values().iterator(); while (it.hasNext()) { HttpSession s = it.next(); Map<String, Object> map = new HashMap<String, Object>(); map.put( "id" , s.getId()); SimpleDateFormat sdf= new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ); map.put( "createTime" , sdf.format( new Date(s.getCreationTime()))); map.put( "lastAccessedTime" ,sdf.format( new Date(s.getLastAccessedTime())) ); map.put( "ip" , s.getAttribute( "ip" )); //ip信息在characterFilter中补 map.put( "user" , s.getAttribute( "user" )); list.add(map); } } request.setAttribute( "onlines" , list); request.getRequestDispatcher( "/jsps/show.jsp" ).forward(request, response); } } |
KickOutServlet.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
package cn.hncu.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class KickOutServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String id=request.getParameter( "id" ); Map<String, HttpSession> onlines=(Map<String, HttpSession>) request.getServletContext().getAttribute( "onlines" ); if (onlines!= null ) { if (onlines.containsKey(id)) { onlines.get(id).invalidate(); } } request.getRequestDispatcher( "/servlet/ShowServlet" ).forward(request, response); } } |
LoginOutServlet.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
package cn.hncu.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginOutServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getSession().invalidate(); response.sendRedirect(request.getContextPath()+ "/index.jsp" ); } } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。