先在web.xml文件中配置以过滤掉所有的请求:
用如下代码说明过滤执行过程:
创建四个文件:
创建文件:index.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>
<a href="./DataServlet?name=张三">链接</a>
</body>
</html>
创建文件:DataServlet.java中代码如下
package com.zzu.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 DataServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(request.getCharacterEncoding()+";"+response.getCharacterEncoding());
String name=request.getParameter("name"); //获取a标签中传过来的数据
System.out.println(name);
response.sendRedirect("./result.jsp"); //重定向:两次请求,两次转发。
}
}
创建文件:result.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>
OK!
</body>
</html>
创建文件:过滤器文件代码如下
package com.zzu.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 fConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println(11);
request.setCharacterEncoding("UTF-8");//对来自客户端的数据进行编码
response.setCharacterEncoding("UTF-8");//对服务器端相应的数据进行编码
chain.doFilter(request, response);//该方法执行的时候,到Dataservlet.java文件,将传的参数得到,方法执行完毕,再输出下边。
System.out.println(22);
}
public void destroy() {
}
}
分析执行过程:
请求index.jsp页面
1,访问请求index.jsp页面,此时没有传参数——>因为配置了过滤所有的文件,所以开始过滤,执行过滤器中的代码
输出:
11
22
下边为访问得到的页面
点击链接
请求DataServlet.java页面
2,点击得到的页面中的链接
输出:
11
UTF-8;UTF-8
张三
22
11
22
点击链接后——>请求服务器页面,传参数——>开始过滤请求,先执行过滤器中代码,输出11,执行“设置请求和相应编码”的代码——>chain.doFilter(request, response);
该方法开始执行时编码已经设置完毕。执行时:执行Dataservlet.java文件中的代码,将传的参数得到并返回,此时方法执行完毕,再输出下边的22,一次请求完成,一次过滤完成,下边重定向到result.jsp页面,又是一次请求。
重定向时:
请求result.jsp页面
没有传参数——>开始执行过滤器中的代码
输出:
11
22
这个过程总的输出为
11
22
11
UTF-8;UTF-8
张三
22
11
22
注意:上述每次请求都会执行doFilter方法。
补充
过滤所有的文件无形中增加了过滤器的负担,为了减少负担,配置如下文件:配置以.*
(*可以是任意的)结尾的请求。只对.*
结尾的文件执行过滤方法。降低过滤器负担。注意改变web.xml中代码需重启服务器。
以配置.do为例:
<servlet-mapping>
<servlet-name>DataServlet</servlet-name>
<url-pattern>/DataServlet.do</url-pattern>
</servlet-mapping>
<filter>
<display-name>EncodingFilter</display-name>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.zzu.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
改变的信息如下:
请求代码也要改,
<%@ 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>
<a href="./DataServlet.do?name=张三">链接</a>
</body>
</html>
更改的信息如下:
.do
只是一个要过滤文件的标识,不是文件类型标示符,此处.java
也是可以的。
./DataServlet.do
访问的还是./DataServlet
文件、只是告诉过滤器过滤.do
结尾的文件。此时访问index.jsp不会过滤,点击连接时开始过滤DataServlet文件,重定向时,不会过滤result.jsp文件。
其他参考
filter执行步骤:
https://blog.csdn.net/wxwzy738/article/details/8616878
filter配置以及执行顺序的细节:
https://yuzhiqiang.blog.csdn.net/article/details/81288912?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control