1.Filtering的基本思想
将jsp,servlet,html看作资源,容器用来处理这些资源,并为资源提供服务。因此在处理这些资源之前或之后,通过过滤器增加一些通用功能;比如:登录权限验证,字符编码转换,资源访问权限控制,敏感词汇过滤。
1.编写过滤器
package edu.etime.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.annotation.WebFilter; /** * 过滤字符编码的filter * 过滤器 :必须要实现接口Filter * @author zw */ public class EncodeFilter implements Filter {
//变量给初始值的目的:在配置文件中如果没有配置,那么默认使用这个值 private String encode = "utf-8"; private String contenttype="text/html"; /** * doFilter是一个主要的过滤器方法。过滤的主要代码都是放在这个方法中的。 * 在实现doFilter这个方法的时候,要注意,最后都要加上一句chain.doFilter(request, response); * chain.doFilter(request, response);作用:继续去执行下一个过滤器 */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // place your code here request.setCharacterEncoding(encode); response.setCharacterEncoding(encode); response.setContentType(contenttype); // pass the request along the filter chain chain.doFilter(request, response); }
/** * 过滤器的初始化方法。课件在这个方法中获取初始化的参数 * 例如:在本例中,可以将具体的编码放入到配置文件中。 * 比如说:utf-8这个参数(参数具有可变性),一般不会在程序中写死。 */ public void init(FilterConfig fConfig) throws ServletException { encode = fConfig.getInitParameter("encode"); contenttype = fConfig.getInitParameter("contenttype"); } } |
注意:
1.过滤器本身就是一个类,必须要实现Filter接口
2.在doFilter方法的最后一句,必须要有chain.doFilter(request,response)
3.初始化参数不要再程序中写死,而因该放在配置文件中
2,编写配置文件
<!-- 配置字符编码的过滤器 --> <filter> <!-- 过滤器的名称,可以随便取 --> <filter-name>encode</filter-name> <!-- 过滤器类的全名称 --> <filter-class>edu.etime.filter.EncodeFilter</filter-class> <!-- 配置过滤器的初始化参数 --> <init-param> <param-name>encode</param-name> <param-value>utf-8</param-value> </init-param> <init-param> <param-name>contenttype</param-name> <param-value>text/html</param-value> </init-param> </filter> <!-- 配置过滤器的过滤路径(那些URL请求会被过滤) --> <filter-mapping> <!-- 与上面的节点中的name一致 --> <filter-name>encode</filter-name> <!-- 过滤路径。*是一个通配符,表示所有。/*项目跟目录下的所有请求都要过滤 --> <url-pattern>/*</url-pattern> </filter-mapping> |
二.监听器
1.监听器的概念:
web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件
2、监听器常用的用途
- 通常使用Web监听器做以下的内容:
- 统计在线人数,利用HttpSessionLisener
- 加载初始化信息:利用ServletContextListener
- 统计网站访问量
- 实现访问监控(监听request对象)---stuts2通过监听器来实现访问控制的
2.2 实现在线人数统计功能
1、实现原理
监听session对象,当session创建的时候认为在线人数+1;当session销毁的时候认为在线人数-1
2、创建监听器
package edu.etime.listener;
import javax.servlet.ServletContext; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; /** * 统计在线人数的监听器,将在线人数放在servletContext中 * @author * */ public class SessionListenerDemo implements HttpSessionListener {
/** * session创建的时候触发 */ public void sessionCreated(HttpSessionEvent se) { ServletContext application = se.getSession().getServletContext(); int count = 1; if(application.getAttribute("count")!=null){ count = (Integer)(application.getAttribute("count"))+1; } application.setAttribute("count", count); }
/** * session销毁的时候触发 */ public void sessionDestroyed(HttpSessionEvent se) { ServletContext application = se.getSession().getServletContext(); int count = (Integer)(application.getAttribute("count"))-1; application.setAttribute("count", count); }
} |
3、配置监听器
<!-- 配置监听器 --> <listener> <listener-class>edu.etime.listener.SessionListenerDemo</listener-class> </listener> |