过滤器

122 阅读2分钟

学习感受

今天学习了过滤器,感觉过滤器并不是很难理解。过滤器就是一个在请求的时候需要对请求进行预处理,然后到达服务器,在服务器得到响应之后,再进行后处理的一个过滤器。

构建过滤器的一般步骤

构建过滤器一般分为两步,第一步,实现过滤器类,主要是实现doFilter方法,第二步,在web.xml文件注册过滤器。

过滤器简单实例

下面,我们就两个简单的过滤器进行实现,一个是解决中文乱码问题,一个是解决用户登录的安全权限问题。 中文乱码问题:

public class CharacterEncodingFilter implements Filter{
    private FilterConfig config;
    
    @Override
	public void destroy() {
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
	
		request.setCharacterEncoding(config.getInitParameter("charset"));
		//请求拦截处理完成之后,要调用chain对象的doFilter方法告诉服务器请求拦截处理已经完成了
		chain.doFilter(request, response);
	}

	@Override
	public void init(FilterConfig config) throws ServletException {
		this.config = config;

	}

	public FilterConfig getConfig() {
		return config;
	}

	public void setConfig(FilterConfig config) {
		this.config = config;
	}
}

其次,我们在web.xml文件进行注册:

 <!-- 注册过滤器 -->
  <filter>
  	<filter-name>characterEncodingFilter</filter-name>
  	<filter-class>filter.CharacterEncodingFilter</filter-class>
  	 <!-- 配置过滤器的初始化参数 -->
  	 <init-param>
  	 	<param-name>charset</param-name>
  	 	<param-value>UTF-8</param-value>
  	 </init-param>
  </filter>
  <!-- 拦截映射配置,指定过滤器对哪些请求进行过滤 -->
  <filter-mapping>
  	<filter-name>characterEncodingFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

下面,我们进行下一个过滤器,解决用户登录安全权限问题:

package 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.HttpServletResponse;

public class SessionFilter implements Filter {

	@Override
	public void destroy() {
		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		
		//做一个类型转换,将request转换成HTTPServletRequest的对象
		HttpServletRequest hrequest = (HttpServletRequest)request;
		HttpServletResponse hresponse = (HttpServletResponse)response;

		//判断用户session中是否有用户的登录名称来判断用户是否进行登录操作
		String loginUser = (String)hrequest.getSession().getAttribute("loginUser");
		
		//如果值为null的话,说明用户没有登录,做一个强制的重定向,转到登录界面
		if(loginUser == null) {
			hresponse.sendRedirect(hrequest.getContextPath()+"/index.jsp?flag=1");
			return;
		}else {
			chain.doFilter(hrequest, hresponse);
			return;
		}
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		

	}

}

web.xml文件注册过滤器

  <!-- 注册过滤器 -->
  <filter>
  	<filter-name>sessionFilter</filter-name>
  	<filter-class>filter.SessionFilter</filter-class>
  </filter>
  <!-- 拦截映射配置,指定过滤器对哪些请求进行过滤 -->
  <filter-mapping>
  	<filter-name>sessionFilter</filter-name>
  	<url-pattern>/message.jsp</url-pattern>
  </filter-mapping>