欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

WEB开发 16:Servlet Filter

程序员文章站 2022-05-13 19:05:23
...

 

WEB开发 16:Servlet Filter

WEB开发 16:Servlet Filter

WEB开发 16:Servlet Filter

WEB开发 16:Servlet Filter

 

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

WEB开发 16:Servlet Filter

 

将在第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

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

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

WEB开发 16:Servlet Filter

 

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

<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();