1.Filter拦截请求
处理请求 直接给予响应 转发 重定向 放行
浏览器发出的请求都会经过Filter 前提是配置为/*
从服务器内部发送出来的请求转发forward,默认是不经过Filter的
从服务器内部发送出来的请求重定向sendRedirect,默认是会经过Filter的
如果是同一次请求,默认不经过Filter,新请求则会经过。我们可以自行设置
<filter>
<filter-name>one</filter-name>
<filter-class>Filter.FilterOne</filter-class>
</filter>
<filter-mapping>
<filter-name>one</filter-name>
<url-pattern>/*</url-pattern>
<!-- 默认,写不写都可以-->
<dispatcher>REQUEST</dispatcher>
<!-- 设置转发也可以经过Filter;如果想要转发和重定向都经过Filter,两个都要写上-->
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
2.Filter处理请求
好多真实资源之前的一个操作 用户认证
通常拦截pattern / .xxx
多个Filter都匹配同一个pattern 执行顺序?
多个filter都会执行
看起来是按照我们的web.xml的配置顺序来执行
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<filter>
<filter-name>one</filter-name>
<filter-class>Filter.FilterOne</filter-class>
</filter>
<filter-mapping>
<filter-name>one</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>three</filter-name>
<filter-class>Filter.FilterThree</filter-class>
</filter>
<filter-mapping>
<filter-name>three</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>two</filter-name>
<filter-class>Filter.FilterTwo</filter-class>
</filter>
<filter-mapping>
<filter-name>two</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>controller.LoginController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>
package controller;
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 LoginController extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
System.out.println("我是真实的目标,取值,调用业务,转发");
req.getRequestDispatcher("welcome.jsp").forward(req,resp);
}
}
package Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class FilterOne extends HttpFilter {
@Override
protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("FilterOne执行了,放行前");
chain.doFilter(request,response);
System.out.println("FilterOne放行后");
}
@Override
public void destroy() {
}
}
FilterTwo、FilterThree做测试用,除了名字其余都和FilterOne一样
index.jsp**
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
</head>
<body>
<form action="login" method="post">
账号:<input type="text" name="username" value=""><br>
密码:<input type="password" name="password" value=""><br>
<input type="submit" value="登录">
</form>
</body>
</html>
welcome.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
</head>
<body>
welcome!
</body>
</html>
运行结果如下
**