Servlet3-过滤器,监听器

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、监听器常用的用途

  1. 通常使用Web监听器做以下的内容:
  2. 统计在线人数,利用HttpSessionLisener
  3. 加载初始化信息:利用ServletContextListener
  4. 统计网站访问量
  5. 实现访问监控(监听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>

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值