一。为什么要过滤 器
前面 的内容 中,我们知道
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容器的监听器的作用。