Filter过滤执行过程


先在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值