简单Servlet,是作为一种程序所必须的开发结构保存下来的
过滤Servlet
监听Servlet
既然是一个Servlet,之前是采用了继承HttpServlet类的形式完成的,但是在过滤器中使用的不再是类而是接口
如果想要完成一个过滤器开发的话,则首先必须让一个类实现Filter接口。此接口是javax.servlet包中的,那么根据此包的特点就可以发现,此接口的主要功能是完成公共协议操作的。
实现过滤器
在Servlet中,如果要定义一个过滤器,则直接让一个类实现javax.servlet.Filter 接口即可,此接口地ing有了三个操作方法:
1、void init(FilterConfig filterConfig) throwsServletException
2、void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException, ServletException
3、void destroy()
- package org.gz.filter;
- import javax.servlet.*;
- import java.io.*;
- public class SimpleFilter implements Filter {
- public void init(FilterConfig config) throws ServletException {
- String info = config.getInitParameter("ref");
- System.out.println("*** 过滤器初始化开始 ***" + info);
- }
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
- throws IOException, ServletException {
- System.out.println("执行doFilter");
- }
- public void destroy() {
- System.out.println("****** 过滤器销毁 ******");
- }
- }
但是过滤这种操作本身可是 属于自动完成的。
过滤器完成之后肯定也要开始进行配置的操作,但是在配置之前,先讲服务器启动一下,观察没有过滤器时的操作。
此时,可以正确的出现文件的列表,下面开始增加配置
- <servlet>
- <servlet-name>filter</servlet-name>
- <servlet-class>package org.gz.filter.SimpleFilter</servlet-class>
- <init-param>
- <param-name>ref</param-name>
- <param-value>zhongtian</param-value>
- </init-param>
- </servlet>
- <servlet-mapping>
- <servlet-name>filter</servlet-name>
- <url-pattern>/*</url-pattern>
- </servlet-mapping>
过滤器不需要任何的配置就可以在服务器启动的时候自动的完成初始化的操作
一个过滤器的基本生命周期与Servlet是非常相似的,但是现在为什么界面上生命都不显示了呢?
FilterChain 表示把请求向下传递,如果后面还有过滤器,则继续过滤,如果没有则直接到目的地
过滤器实际上是执行两次的,
与Servlet一样,过滤器本身也可以对多个路径执行过滤,例如:
- <filter-mapping>
- <filter-name>simple</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>simple</filter-name>
- <url-pattern>/jsp/dom</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>simple</filter-name>
- <url-pattern>/jsp/*</url-pattern>
- </filter-mapping>
对于编码肯定是所有页面都要使用的,而且只要是页面都要缩写: request.setCharaterEncoding() 方法 进行编码设置
- <filter>
- <filter-name>encoding</filter-name>
- <filter-class>org.gz.filter.EncodingFilter</filter-class>
- <init-param>
- <param-name>charset</param-name>
- <param-value>GBK</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>encoding</filter-name>
- <url-pattern>/*</url-pattern>
- package org.gz.filter;
- import javax.servlet.*;
- import java.io.*;
- // 在web.xml 下面设置所有被过滤的文件编码是 GBK
- public class LoginFilter implements Filter {
- private String charSet;
- public void init(FilterConfig config) throws ServletException {
- this.charSet = config.getInitParameter("charset");
- }
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
- throws IOException, ServletException {
- request.setCharacterEncoding(this.charSet);
- chain.doFilter(request,response);
- }
- public void destroy() {
- }
- }
- package org.gz.filter;
- import javax.servlet.*;
- import java.io.*;
- //org.gz.filter.SimpleFilter
- public class SimpleFilter implements Filter {
- public void init(FilterConfig config) throws ServletException {
- String info = config.getInitParameter("ref");
- System.out.println("*** 过滤器初始化开始 ***" + info);
- }
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
- throws IOException, ServletException {
- System.out.println("执行doFilter() 之前");
- chain.doFilter(request,response);
- System.out.println("执行doFilter() 之后");
- }
- public void destroy() {
- System.out.println("****** 过滤器销毁 ******");
- try
- {
- Thread.sleep(3000);
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
- }
先完成登录验证的过滤器
- package org.gz.filter;
- import javax.servlet.*;
- import java.io.*;
- import javax.servlet.http.*;
- // 在web.xml 下面设置所有被过滤的文件编码是 GBK
- public class EncodingFilter implements Filter {
- public void init(FilterConfig config) throws ServletException {
- }
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
- throws IOException, ServletException {
- //session 术语http 协议范畴
- HttpServletRequest req = (HttpServletRequest) request;
- HttpSession ses = req.getSession();
- if(ses.getAttribute("userid") != null) {
- // 已经登录过了,则可以访问
- chain.doFilter(request,response);
- } else {
- request.getRequestDispatcher("login.jsp").forward(request,response);
- }
- }
- public void destroy() {
- }
- }