1:用于拦截传入的请求和传出的响应,也可看可改数据
1:以便监视或者修改客户端和服务器之间数据的交流
2:统一拦截字符集设置,在映射文件里设置字符编码,使代码实现动态化
3:统一拦截非登陆界面,判断用户是否从登陆界面过来的
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>/*
第三步:登陆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");
}
}
一:生命周期:
1、容器启动时加载和初始化
2:初始化:init()
3:执行过滤:doFilter()
4:销毁:destroy()
二:初始化参数:配置在映射文件会在初始化时就加载的信息
5:读取初始化参数,配置过滤器过滤的字符集
6:Filter的应用场景:
在映射文件里的初始化参数改字符集编码
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>/*
映射文件里初始化参数的读取&生命周期
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() { //销毁
}
}
1:多个过了过滤器会组成过滤器链
为什么:1:过滤器只需要一次拦截多个页面(文件夹),相比之前判断是否有请求值,在用include的方法简单多了。
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>/*
SessionValidateFilter
filter.SessionValidateFilter
SessionValidateFilter
/admin/*
过滤器
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
}
}