WEB开发 16:Servlet Filter

 

WEB开发 16:Servlet Filter_第1张图片

WEB开发 16:Servlet Filter_第2张图片

WEB开发 16:Servlet Filter_第3张图片

WEB开发 16:Servlet Filter_第4张图片

 

doFilter方法中有一个FilterChain参数,用于表示过滤器链,下面这个草图就是过滤器链的简单表述。

WEB开发 16:Servlet Filter_第5张图片

 

将在第15课中的登录程序使用过滤器重写

LoginFilter.java     在这个过滤器中判断session中的user是否存在,如不存在就返回登录界面

package com.test.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.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

public class LoginFilter implements Filter {

	public void destroy() {
		System.out.println("filter destroy invoed");
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest r = (HttpServletRequest)request;
		String requestURI = r.getRequestURI();
		//下面这两个页面,不能过滤,在MyLoginServlet中还是需要判断session中的user是否为空
		if(requestURI.endsWith("login.jsp") || requestURI.endsWith("MyLoginServlet")){
			chain.doFilter(request, response);
			return;
		}
		
		HttpSession session = r.getSession();
		//如果session中的user为空,则返回登录页面
		if(null == session.getAttribute("user")){
			request.getRequestDispatcher("/filter/login.jsp").forward(request, response);
			return;
		}else{
			chain.doFilter(request, response);
		}
	}

	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("filter init invoked");
	}

}

 

过滤器新建好后,需要配置web.xml文件

<filter>
  	<filter-name>loginfilter</filter-name>
  	<filter-class>com.test.filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
   	<filter-name>loginfilter</filter-name>
   	<url-pattern>/*</url-pattern>
  </filter-mapping>

 

过滤链

WEB开发 16:Servlet Filter_第6张图片

存在多个过滤链时,是以在web.xml文件中的序列来排队过滤。

如下图,两个url-pattern是一样的,表示都对note进行过滤,先进filter1再进filter2过滤器。

WEB开发 16:Servlet Filter_第7张图片

 

此外还可以为过滤器配置初始参数

<filter>
  	<filter-name>loginfilter</filter-name>
  	<filter-class>com.test.filter.LoginFilter</filter-class>
  	<init-param>
  		<param-name>hello</param-name>
  		<param-value>world</param-value> 	
  	</init-param>
  	<init-param>
  		<param-name>zhang</param-name>
  		<param-value>sang</param-value> 	
  	</init-param>
  </filter>

 然后在filter类的init方法中取出。

public void init(FilterConfig filterConfig) throws ServletException {
		String value1 = filterConfig.getInitParameter("hello");
		String value2 = filterConfig.getInitParameter("zhang"); 
	}

 

此外还可以在filter类中获取application对象,如下

filterConfig.getServletContext();

 

HttpServletRequest r = (HttpServletRequest)request;
r.getSession().getServletContext();

 

你可能感兴趣的:(servlet)