过滤器和监听器

一。为什么要过滤 器

   前面 的内容 中,我们知道 

request.setCharacterEncoding("gb2312");

这是将 request 内的数据编码设置成 gb2312 ,在以 post 方式请求时,如果 目标页面没有这句 , tomcat 服务器将会把中文参数 显示为乱码。

然而 一个大的工程中,如果 这样 会要写很多这样的内容 。

在请求被 处理前,有一个公共的模块,专门负责进行编码的转换,这样 对于编码工作就不用反复编写了。

这可以用过滤 器实现 。

二。编写 过滤 器

先写两个jsp 文件,一个接收输入 ,一个得到结果 。

query.jsp

<b>查询学生数据库</b>
    <form action="queryResult.jsp"  method ="post">
    请输入学生的帐号:<input type ="text"  name ="account">
    <input  type ="submit"  value="查询">
    </form>

queryResult.jsp

 查询的关键字为:<%=request.getParameter("account") %>

传统方法要在 queryResult中解决乱码问题,过滤器可以只要在 web.xml 文件中配置,能够对 JSP ,HTML ,Servlet 进行过滤 ,编写 一个过滤 器要两个步骤 。

(1)实现 Filter接口

(2)实现 三个方法

初始化方法:  

public void init(FilterConfig config);

消亡方法:

public void destroy();

过滤方法:过滤器过滤 时的动作

public void doFilter(ServletRequest request ,ServletResponse pesponse, FilterChain chain);

上面 的三个方法都 在实现 ,因为他们是定义 在Filter 接口中的。

public void doFilter(ServletRequest request, ServletResponse response,
 FilterChain chain) throws IOException, ServletException {
 // TODO Auto-generated method stub
 request.setCharacterEncoding("gb2312");
 chain.doFilter(request, response);
 }

第二名是将请求请求传递,如果 没有这句 ,过滤 器在收到请求处理后,不会传递给目标页面。

(3) 过滤 器的配置

要想让系统 能够 识别 ,还要在 web.xml 中进行配置。

<filter>
  <filter-name>EncodingFilter</filter-name>
  <filter-class>filter.EncodingFilter</filter-class>
 </filter>
 <filter-mapping>
  <filter-name>EncodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

其中,url-pattern 是配置过滤 器的映射,用于指定过滤 器折过滤模式。有三种:

a。过滤所有的 文件

<filter-mapping>
  <filter-name>EncodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

b. 过滤 一个or 多个Servlet (JSP )文件

<filter-mapping>
  <filter-name>FilterName</filter-name>
  <url-pattern>/PATH1/ServletName1(JSPName1)</url-pattern>
 </filter-mapping>
 <filter-mapping>
  <filter-name>FilterName</filter-name>
  <url-pattern>/PATH2/ServletName2/(JSPName2)</url-pattern>
 </filter-mapping>

c. 过滤 一个或者 多个文件目录

<filter-mapping>
  <filter-name>FilterName</filter-name>
  <url-pattern>/PATH1/*</url-pattern>
 </filter-mapping>

注意,

 过滤 器的初始化是在服务器运行的时候自动进行的。 doFilter()是在每次提交 被 处理前被调用 的。

大项目中会用到很多过滤 器,但是如果每一个过滤 器如果都在服务器中实例 化,会有很大的开销,所以如果 不是核心的安全功能 ,我们放在客户端完成 。


三。过滤 器的其它应用

1. 检查 session

session查检有两个方面的意思 ,一是没有登录的用户不能访问受限的页面。二是已经登录的用户不能访问登录页面。

这里只要用一个 session检查就可以了,在访问任何页面前,检查session 中是否有 account 的信息。进行session 检查呢,可以 在过滤 器中完成 。

2. cookie检查

在访问页面前,过滤 器中读取Cookie的值 ,将cookie中的帐号的密码 ,用 DAO进行验证,如果 成功,直接 跳转到登录成功的页面。

3. 权限检查


四,监听 器

当用户登录,信息存入  session中时,要将登录时间保存在日志中,退出时,也是的,这就是一些 额外 的工作,将额外 的工作与业务逻辑分开,这就是servlet容器的监听器的作用。



你可能感兴趣的:(过滤器和监听器)