前言
过滤器和我们生活中净水器可以说是一个道理的,就是用来过滤网站的数据。
1. Filter
Filter : 过滤器,用来过滤网站的数据
生活中的应用 : 处理中文乱码, 登录验证…
[1] 我们客户端发送请求时,可能带有一些中文字符,这时候服务器响应相关信息时,就得先进行过滤,让编码进行转化。
[2] 登录操作时,我们必须输入账号和密码才能进入网站首页,如果没有过滤器,我们直接打入首页的网址就可进入,那么这就存在安全性能问题。
Filter 开发步骤
实现中文编码转化的方法
package com.gs.filter;
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
//初始化
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CharacterEncodingFilter初始化.....");
}
//Chain: 链
/*
1. 过滤中的所有代码,在过滤特定的请求是都会执行
2. 必须要让过滤器通行
chain.doFilter(request,response)
*/
//过滤
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
System.out.println("characterEncodingFilter执行前...");
chain.doFilter(request,response); //让我们的请求继续
System.out.println("characterEncodingFilter执行后...");
}
//销毁:web服务器关闭的时候,过滤会销毁
@Override
public void destroy() {
System.out.println("CharacterEncodingFilter销毁.....");
}
}
开发的时候的注意点:
- 过滤中的所有代码,在过滤特定的请求是都会执行
- 必须要让过滤器通行
chain.doFilter(request,response)
在web.xml中配置过滤器
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>com.gs.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<!--只要是 /servlet的任何请求,会经过这个过滤器 -->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
下面我们通过一个带有中文字符的网页对上面的过滤器进行解析
[1] 编写ShowServlet类,这里只是简单的在网页上输出 你好,世界!
package com.gs.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ShowServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//resp.setCharacterEncoding("utf-8");
resp.getWriter().write("你好,世界!");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
在web.xml中注册servlet
为了验证效果,我们把loginServlet设置了两个映射路径一个是/servlet/show,一个是 /show
<servlet>
<servlet-name>showServlet</servlet-name>
<servlet-class>com.gs.servlet.ShowServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>showServlet</servlet-name>
<url-pattern>/show</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>showServlet</servlet-name>
<url-pattern>/servlet/show</url-pattern>
</servlet-mapping>
[4] 编写过滤器,和我们上面所编写的例子(实现中文编码转化的方法)一致,这里我们处理的是/servlet/* 下的所有文件,那么当我们使用/show 进行访问时,过滤器不会进行拦截,那么它就会出现中文乱码;而使用/servlet/login 进行访问时则会进行拦截,这样就不会出现中文乱码问题
当我们访问 localhost:8080/show时,这时由于没有经过过滤器,所以会产生中文乱码问题。
当我们访问 localhost:8080/servlet/show时,这时候,它会经过过滤器,所以它就可以正常显示中文字符。