为什么使用过滤器
1、为了解决中文乱码的问题,我们经常在代码段中能够看到一段代码
request.setCharacterEncoding("gb2312");
request.setContentType("text/html;charset=gb2312");
这是Servlet用来设置编码的,如果Servlet的最前面没有输入这段代码就会出现乱码,如果是一个大工程的话,会有很多很多Servlet,在设置时是非常的繁琐。
2、在登录页面中,如果使用传统的session检查来完成,就需要在很多页面上都添加session检查代码,当然,这是一种比较繁琐的行为
3、在网站中都存在管理权限,是由管理员才能够对数据进行修改,而普通用户只能修改简单的一些数据,在登录之后又该如何判断管理员与普通用户的区别??如果还是采用在每个页面都写一个判断用户类型的代码,也是非常繁琐的
对于上面的3种情形,都可以用过滤器进行操作,那么过滤器到底是啥?过滤器就是一种小巧的、可插入的web组件,它能够对web应用程序前期和后期处理进行控制,可以拦截请求和响应,查看提取或者以某种方式操作正在客户端和服务器之间进行交换的数据。
编写过滤器
实现过滤器需要两个步骤:
1.实现接口Filter
2.实现3个方法 init(),destroy().doFilter();
我们以中文乱码问题进行编写
首先编写一个登录界面login.jsp,模拟用户登录
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<form action="" method="post">
请输入用户名:<input type="text" name="username"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
运行该界面:
点击登录将表单提交给Servlet处理。
编写WelcomeServlet
package cn.lystery.Servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class WelcomeServlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
System.out.println("欢迎"+username);
}
}
对WelcomeServlet进行配置,编写web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>WelcomeServlet</servlet-name>
<servlet-class>cn.lystery.Servlet.WelcomeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>WelcomeServlet</servlet-name>
<url-pattern>/WelcomeServlet</url-pattern>
</servlet-mapping>
</web-app>
运行login.jsp
测试发现出现乱码
通常解决乱码是在Servlet中设置编码,此处,我们用添加过滤器的方法解决乱码;
编写编码过滤器EncodingFilter,实现接口Filter
package cn.lystery.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;
public class EncodingFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
chain.doFilter(request, response);
}
public void destroy() {
}
}
在web.xml中配置过滤器
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>cn.lystery.Filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
重新运行login.jsp
发现乱码问题已经解决
关于配置Filter
filter 元素有两个必要子元素
1.filter-name:用来设定过滤器的名字,可以自己定义,不要要和映射的对应
2.filter-class:用来设定过滤器的类路径
filter-mapping 配置过滤器的映射
1.filter-name:用来设定过滤器的名字,可以自己定义,和filter的需要对应
2.url-pattern:过滤模式