学习笔记:过滤器


web

第一节:过滤器的定义和使用

what?

1:用于拦截传入的请求和传出的响应,也可看可改数据

Why use it?

1:以便监视或者修改客户端和服务器之间数据的交流
2:统一拦截字符集设置,在映射文件里设置字符编码,使代码实现动态化
3:统一拦截非登陆界面,判断用户是否从登陆界面过来的

how?

1::编写登陆案例,制造乱码场景
2:编写过滤器:
a、新建一个类
b、实现Filter接口(init/ doFilter/ destroy)
c、编写过滤操作
d、调用目标资源(将任务传递给下一个资源)

3:在映射文件配置过滤器url-pattern(拦截范围):
a、精准匹配 /XXX
b、目录匹配 /admin/* 判断是否是从登陆页面的
c、后缀名匹配 *.action
d、全部匹配/🌟 设置字符集时用

实现步骤:
第一步:先编写过滤器类

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;

/*
 * 过滤器
 * 1:使用之前需要在web.xml上进行配置
 * 2:拦截之后要放行chan.doFilter()
 */
public class EncodingFilter implements Filter{    //实现 Filter接口就变成了过滤器类

	@Override
	public void destroy() {     //销毁
		
		
	}

	@Override    
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)    //过滤操作:是ServletRequest 而不是HttpServletRequest 是因为想和协议无关
			throws IOException, ServletException {
		System.out.println("过滤器");
		//放行之前设置邮政编码
		request.setCharacterEncoding("UTF-8");
		//拦截之后的放行,执行下一个的目标资源(Servle)
		chain.doFilter(request, response);
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {     //初始化
		// TODO Auto-generated method stub
		
	}
		

第二步:配置过滤器的映射文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
	<!-- 配置过滤器 -->
	<filter>
		<filter-name>EncodingFilter</filter-name>
		<filter-class>filter.EncodingFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>EncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>  <!--精确匹配  -->
	</filter-mapping>
</web-app>

第三步:登陆jsp页面

<body>
	<!-- request内置对象 -->
	<form action="login" method="get">    <!-- 需要提交到UserInfoServlet页面,而userInfo是它的重名,所以这里需要区web.xml配置文件访问路径 -->
		用户名:<input name="userName"/><br/>    
		密码:<input name="userPwd"/><br/>
		<input type="submit" value="登陆"/>
	</form>
</body>

第四步:在servlet里应用过滤器

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/login")    //写了注解就不同在映射文件了
public class LoginServlet extends HttpServlet{
	
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		String userName = request.getParameter("userName");
		String userPwd = request.getParameter("userPwd");
		
		if("刘雯欣".equals(userName)&&"123".equals(userPwd)) {
			request.setAttribute("name", userName);
			System.out.println(userName);
			request.getRequestDispatcher("/success.jsp").forward(request, response);
		}else {
			response.sendRedirect("/web10/file.jsp");
		}
	}

第二节:过滤器的生命周期和初始化参数

what?

一:生命周期:
1、容器启动时加载和初始化
2:初始化:init()
3:执行过滤:doFilter()
4:销毁:destroy()
二:初始化参数:配置在映射文件会在初始化时就加载的信息
5:读取初始化参数,配置过滤器过滤的字符集

Why use it?

6:Filter的应用场景:

  • 日志记录
  • 统一设置(字符集编码设置)
  • 安全与会话管理
  • 敏感字过滤

How?

在映射文件里的初始化参数改字符集编码
why:因为字符集可能会发生改变,建议不要直接在代码里设置,在映射文件里可以动态设置。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
	<!-- 配置过滤器 -->
	<filter>
		<filter-name>EncodingFilter</filter-name>
		<filter-class>filter.EncodingFilter</filter-class>
		<!-- 配置初始化参数的形式配置UTF-8 -->
		<init-param>
				<param-name>encoding</param-name>
				<param-value>UTF-8</param-value>
		</init-param>
		
	</filter>
	<filter-mapping>
		<filter-name>EncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>  <!--精确匹配  -->
	</filter-mapping>
</web-app>

映射文件里初始化参数的读取&生命周期

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;

/*
 * 过滤器
 * 1:使用之前需要在web.xml上进行配置
 * 2:拦截之后要放行chan.doFilter()
 * 3过滤器的生命周期:
 * 		a、加载和实例:容器启动时
 * 		b、into()
 * 		c、doFilter()
 * 		d、destroy()
 * 4:过滤器的优先级比Servlet高
 */
public class EncodingFilter implements Filter{    //实现 Filter接口就变成了过滤器类
	private String encoding;
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {     //初始化
		//读取初始化参数的方式
		this.encoding= filterConfig.getInitParameter("encoding");
		
	}
	

	@Override    
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)    //过滤操作:是ServletRequest 而不是HttpServletRequest 是因为想和协议无关
			throws IOException, ServletException {
		System.out.println("过滤器");
		//放行之前设置邮政编码
		request.setCharacterEncoding("encoding");
		//拦截之后的放行,执行下一个的目标资源
		chain.doFilter(request, response);
	}

	@Override
	public void destroy() {     //销毁
		
	}
		
}

第三节:过滤器链接和登陆验证

what?

1:多个过了过滤器会组成过滤器链

why use it?

为什么:1:过滤器只需要一次拦截多个页面(文件夹),相比之前判断是否有请求值,在用include的方法简单多了。

how?

1:案例:未登陆的用户不能访问admin文件夹的jsp文件
3:过滤器链的执行顺序:映射文件编辑的顺序
4:多个过滤器链的加载和执行顺序,取决于web.xml中的配置顺序
5:过滤器的执行顺序
a、用户访问web资源时,发送的请求会先经过过滤器
b、由过滤器对请求数据进行判断处理
c、经过过滤器的请求数据被发送至目标资源进行处理
d、经过过滤器的处理后,响应被返回客户端

映射文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
	<!-- 配置过滤器 -->
	<filter>
		<filter-name>EncodingFilter</filter-name>
		<filter-class>filter.EncodingFilter</filter-class>
		<!-- 配置初始化参数的形式配置UTF-8 -->
		<init-param>
				<param-name>encoding</param-name>
				<param-value>UTF-8</param-value>
		</init-param>
		
	</filter>
	<filter-mapping>
		<filter-name>EncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>  <!--精确匹配  -->
	</filter-mapping>
	
	<!-- 配置过滤器 -->
	<filter>
		<filter-name>SessionValidateFilter</filter-name>
		<filter-class>filter.SessionValidateFilter</filter-class>	
	</filter>
	<filter-mapping>
		<filter-name>SessionValidateFilter</filter-name>
		<url-pattern>/admin/*</url-pattern>  <!--admin下的jsp文件都会被拦截下 -->
	</filter-mapping>
</web-app>

过滤器

package 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;
import javax.servlet.http.HttpSession;

public class SessionValidateFilter implements Filter{

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	//是否从登陆页面过来的过滤
	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest request =(HttpServletRequest)req;    //将req强转成HttpServletRequest就可以调用它的方法了
		HttpServletResponse response =(HttpServletResponse)resp;
		HttpSession session = request.getSession();
		if(session.getAttribute("name")!=null) {
			chain.doFilter(request,response);
		}else {
			response.sendRedirect("../login.jsp");
		}
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值