过滤器的概念

过滤器也是一种特殊的servlet,也需要在配置文件中进行配置或者使用注解进行配置,过滤器可以将指定的请求拦截下来,之后对被拦截的请求进行相关的处理或者验证,处理完毕之后将拦截的请求继续放行
过滤器(处理字符编码)
要实现过滤器需要使用到一个接口javax.servlet.Filter

过滤器使用

一.定义过滤器

package com.xie.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 MyFilter implements Filter{
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("过滤器初始化");
	}
	
	/**
	 * 拦截处理请求的方法
	 */
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//向下转型
		HttpServletRequest req = (HttpServletRequest)request;
		HttpServletResponse resp = (HttpServletResponse)response;
	}

	@Override
	public void destroy() {
		System.out.println("销毁过滤器");
	}
}

配置过滤器

<!-- 配置过滤器 -->
  <filter>
  		<filter-name>myFilter</filter-name>
  		<filter-class>com.xie.filter.MyFilter</filter-class>
  </filter>
  <filter-mapping>
  		<filter-name>myFilter</filter-name>
  		<!-- 过滤器处理所有的路径 -->
  		<url-pattern>/*</url-pattern>
  </filter-mapping>

此时上面的过滤器可以拦截所有的路径

访问emp.html
过滤器(处理字符编码)
放行请求:

@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//向下转型
		HttpServletRequest req = (HttpServletRequest)request;
		HttpServletResponse resp = (HttpServletResponse)response;
		//放行请求
		chain.doFilter(req, resp);
	}

过滤器(处理字符编码)
此时就出现了一个疑问:上面的过滤器将请求拦截之后,不做任何处理就放行,拦截有什么意义?

使用过滤器处理字符编码

@SuppressWarnings("serial")
public class EmpServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.login(req, resp);
	}
	public void login(HttpServletRequest req, HttpServletResponse resp) {
		String name = req.getParameter("username");
		String pwd = req.getParameter("pwd");
		System.out.println("用户名:" + name);
	}
}

定义表单

<form action="emp/login" method="POST">
		<fieldset>
			<legend>请登录•</legend>
			用户名<input type="text" name="username"><br><br>
			密码š<input type="password" name="pwd">
			<input type="submit" value="提交">
			<input type="reset" value="重置">
		</fieldset>		
	</form>

此时发现在服务器端取得中文的时候是乱码,向客户端输出中文的时候也是乱码,此时要为请求和响应设置字符编码

设置字符编码

@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//为响应设置字符编码
		resp.setContentType("text/html;charset=utf-8");
		//为请求设置字符编码
		req.setCharacterEncofing("utf-8");
		String username = req.getParameter("username");
		String pwd = req.getParameter("pwd");
		System.out.println("username名:" + pwd);
	}

如果使用以上的方式那么如果有一百个servlet中的请求和响应的字符编码都要设置,此时重复的代码就出现了,可以使用过滤器来解决这一问题

过滤器处理字符编码

/**
* 拦截处理请求的方法
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
	//向下转型
	HttpServletRequest req = (HttpServletRequest)request;
	HttpServletResponse resp = (HttpServletResponse)response;
	//统一处理字符编码
	resp.setContentType("text/html;charset=utf-8");
	req.setCharacterEncoding("utf-8");
	//放行请求
	chain.doFilter(req, resp);
	}

配置过滤器

  <!-- 配置过滤器 -->
  <filter>
  		<filter-name>myFilter</filter-name>
  		<filter-class>com.xie.filter.MyFilter</filter-class>
  </filter>
  <filter-mapping>
  		<filter-name>myFilter</filter-name>
  		<!-- 过滤器处理所有的路径 -->
  		<url-pattern>/*</url-pattern>
  </filter-mapping>

相关文章: