过滤器的概念
过滤器也是一种特殊的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>