1 ¿Qué es el filtro?
- El filtro es uno
JavaWeb
de los tres componentes principales (Servlet
programa,Listenter
oyente,Filter
filtro) Filter
Filtrar esJavaEE
la especificaciónFilter
Rol: solicitud de intercepción (aplicación principal), respuesta de filtro
Solicitud de interceptación
Verificación de permisos
Operación de diario
Gestión de transacciones
······
2 Filtrar primera experiencia
Requisitos: Bajo el proyecto web, hay un admin
directorio, se debe permitir el acceso a admin
todos los recursos ( html,jsp,jpg
etc.) en este directorio después de que el usuario inicie sesión.
Implementar verificación de permisos
1 Escriba una clase para implementar la interfaz de filtro
public class AdminFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } //专门用来拦截请求,权限检查 @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { } @Override public void destroy() { } }
2 Implementar el método de filtrado
doFilter
//专门用来拦截请求,权限检查 @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest; HttpSession session = httpServletRequest.getSession(); Object user = session.getAttribute("user"); //如果等于null,说明还没有登录 if (user == null){ //请求转发 servletRequest.getRequestDispatcher("login.jsp").forward(servletRequest,servletResponse); return; }else{ //让程序继续往下访问用户目标资源 filterChain.doFilter(servletRequest,servletResponse); } }
3
web.xml
Archivo de configuración, configurar la ruta de interceptación<!--filter标签用来配置一个Filter过滤器--> <filter> <!--给filter起一个别名--> <filter-name>AdminFilter</filter-name> <!--配置filter的全类名--> <filter-class>com.gw.filter.AdminFilter</filter-class> </filter> <!--配置filter过滤器的拦截路径--> <filter-mapping> <!--表示当前拦截路径给哪个filter使用--> <filter-name>AdminFilter</filter-name> <!--url-pattern 配置拦截路径--> <!-- / 表示请求地址为: http://ip:port/工程路径/ (web目录) --> <!--/admin/* 表示请求地址为:http://ip:port/工程路径/admin/* (*表示目录下所有文件)--> <url-pattern>/admin/*</url-pattern> </filter-mapping>
En este momento, debido a que aún no hay información de inicio de sesión del usuario, lo admin
reenviaremos automáticamente a la página de inicio de sesión cuando accedamos a los archivos de recursos en el directorio, que realiza la verificación de permisos
Verificación completa de inicio de sesión y permisos de usuario
Simular cuando hay información de inicio de sesión del usuario
Perfecto
login.jsp
<body> 这是登录页面,login.jsp <form action="http://localhost:8080/15_filter/loginServlet" method="get"><br> 用户名: <input type="text" name="username"><br> 密 码: <input type="password" name="password"><br> <input type="submit" value="提交"> </form> </body>
Agregar
LoginServlet
programapublic class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=UTF-8"); String username = request.getParameter("username"); String password = request.getParameter("password"); if ("abc123".equals(username) && "123456".equals(password)){ request.getSession().setAttribute("user",username); response.getWriter().write("登陆成功"); }else{ request.getRequestDispatcher("/login.jsp").forward(request,response); } } }
web.xml
ConfiguraciónLoginServlet
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.gw.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/loginServlet</url-pattern> </servlet-mapping>
Cuando el usuario inicia sesión correctamente y accedemos a admin
los archivos de recursos en el directorio nuevamente , podemos acceder
3 Ciclo de vida del filtro
-
Método constructor
public AdminFilter(){ System.out.println("构造器方法"); }
-
init
Método de inicialización@Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("初始化方法"); }
Los dos métodos anteriores se ejecutan cuando se inicia el proyecto web
-
doFilter
Método de filtradopublic void doFilter
Ejecutar cada vez que se intercepta una solicitud
-
destroy
método@Override public void destroy() { System.out.println("销毁方法"); }
Cuando se detenga el proyecto web, se ejecutará (el filtro también se destruirá)
FilterConfig
Tipo 4
Cada vez que Tomcat crea un filtro, también crea una FilterConfig
clase, que contiene la información de configuración del archivo de configuración.
FilterConfig
El papel de la clase es obtener el contenido de configuración del filtro filtro
- Obtener el nombre del contenido del nombre del filtro del filtro
- Obtener configuración en los
init-param
parámetros de inicialización del filtro- Obtener
ServletContext
objeto
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// System.out.println("初始化方法");
//1 获取Filter的名称 filter-name 的内容
System.out.println("filter-name:" +filterConfig.getFilterName());
// 2 获取在Filter 中配置的 `init-param`初始化参数
System.out.println("初始化参数:username:"+filterConfig.getInitParameter("username"));
System.out.println("初始化参数:url:"+ filterConfig.getInitParameter("url"));
// 3 获取`ServletContext`对象
System.out.println(filterConfig.getServletContext());
}
5 FilterChain
detalles de la implementación de múltiples filtros
-
Cuando se ejecutan varios filtros, su orden de prioridad está determinado por el orden en el que están
web.xml
configurados en el archivo. -
filterChain.doFilter()
Es continuar ejecutando la solicitud para solicitar el archivo de recursos, y saltará al siguiente filtro de filtro (de afuera hacia adentro). Cuando se acceda al archivo de recursos, se ejecutará (de adentro hacia afuera) después de cada filtro de filtro. . Establecer código
6 Ruta de interceptación de filtros
-
Coincidencia exacta (precisa para un archivo)
<url-pattern>/target.jsp</url-pattern>
http: // ip: puerto / ruta del proyecto / target.jsp
-
Coincidencia de directorio (archivos coincidentes en un directorio)
<url-pattern>/admin/*</url-pattern>
http: // ip: puerto / ruta del proyecto / admin / *
-
Coincidencia de nombre de sufijo
<url-pattern>*.html</url-pattern>
Indica que la dirección de la solicitud debe terminar en .html para ser interceptada
Nota
<url-pattern>*.abc</url-pattern>
-
Siempre que termine con el tipo de configuración, no es necesario que sea de este tipo, solo debemos ser el tipo de configuración cuando solicitemos la barra de direcciones
-
No se puede empezar con /
-
Filtro Solo se preocupa por la existencia de la dirección solicitada, no por la existencia del recurso solicitado
-