1.基本介紹
1.為什么需要過濾器?
2.基本介紹
3.過濾器的基本原理
2.快速入門
1.文件目錄
2.環(huán)境配置
創(chuàng)建maven項目,導(dǎo)入依賴
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId>
<version>1.2.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-spec</artifactId>
<version>1.2.5</version>
</dependency>
</dependencies>
3.代碼實現(xiàn)
1.login.jsp
<%--
Date: 2024/1/31
Time: 13:34
User: 孫顯圣
Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="<%=request.getContextPath()%>/loginCheck" method="post">
username:<input type="text" name="username"><br>
password:<input type="password" name="password"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
2.LoginCheck.java
package servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @author 孫顯圣
* @version 1.0
* 驗證信息是否正確,如果正確則設(shè)置session
*/
@WebServlet(urlPatterns = "/loginCheck")
public class LoginCheck extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
if ("666666".equals(password)) {
//設(shè)置session
HttpSession session = req.getSession();
session.setAttribute("name", username);
req.getRequestDispatcher("manager/admin.jsp").forward(req, resp);
}
else {
//不合法直接返回登錄界面
req.getRequestDispatcher("login.jsp").forward(req, resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3.ManagerFilter.java編寫過濾規(guī)則
package filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @author 孫顯圣
* @version 1.0
*/
public class ManagerFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
//當(dāng)filter創(chuàng)建后會調(diào)用這個方法初始化
System.out.println("初始化");
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//每次調(diào)用該filter時該方法就會被調(diào)用
//檢查是否有session,將servletRequest向下轉(zhuǎn)型為httpServletRequest
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpSession session = httpServletRequest.getSession();
//獲取session中的name
Object name = session.getAttribute("name");
if (name != null) {
//繼續(xù)訪問目標(biāo)資源
filterChain.doFilter(servletRequest,servletResponse);
}
else {
httpServletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
}
}
public void destroy() {
//filter被銷毀時會調(diào)用
System.out.println("destroy");
}
}
4.配置web.xml告訴tomcat
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>Archetype Created Web Application</display-name>
<!-- filter一般寫在最前面 -->
<!-- url-pattern就是當(dāng)請求的url與之匹配的時候tomcat就會調(diào)用filter-->
<!-- /manager/*指的就是manager下面所有的資源-->
<filter>
<filter-name>ManagerFilter</filter-name>
<filter-class>filter.ManagerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ManagerFilter</filter-name>
<url-pattern>/manager/*</url-pattern>
</filter-mapping>
</web-app>
5.admin.jsp
<%--
Date: 2024/1/31
Time: 13:37
User: 孫顯圣
Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<base href="<%=request.getContextPath()%>/manager/">
</head>
<body>
<h1 align="center">
管理員界面
</h1>
<img src="1.png" height="600" border="1">
</body>
</html>
3.Filter的執(zhí)行流程
1.服務(wù)器啟動
- 讀取web.xml
- 根據(jù)全類名反射創(chuàng)建過濾器的實例,將其放在name - 實例的容器中,并將url - name容器也填充
- 一共有兩個容器
- url - name
- name - 實例
- 創(chuàng)建FilterConfig對象,調(diào)用 init(FilterConfig filterConfi g)方法初始化過濾器
2.請求匹配
- 遍歷a容器,匹配url
- 如果匹配到,則找到里面的name,并且遍歷b容器,根據(jù)name找到filter實例
- 調(diào)用doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)方法
3.細節(jié)說明
- 過濾器起到一個瀏覽器請求攔截的作用,請求轉(zhuǎn)發(fā)不經(jīng)過過濾器
- 過濾器實例只有一個
- 一旦匹配到過濾器,過濾器只要不做任何操作,就會卡在這個頁面,并不會繼續(xù)匹配servlet
- 除非過濾器調(diào)用filterChain.doFilter(servletRequest, servletResponse)才會放行
- 過濾器里面的servletRequest和servletResponse是httpServletRequest和httpServletResponse的父類,可以向下轉(zhuǎn)型
4.url-pattern
5.Filter生命周期
6.FilterConfig
1.基本介紹
2.代碼演示
1.FilterConfig.java
package filter;
import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;
/**
* @author 孫顯圣
* @version 1.0
*/
public class FilterConfig implements Filter {
public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {
//通過filterConfig獲取相關(guān)的參數(shù)
//1.獲取filter的名字
String filterName = filterConfig.getFilterName();
System.out.println("filterName: " + filterName);
//2.獲取filter配置參數(shù)
String ip = filterConfig.getInitParameter("ip");
System.out.println("ip: " + ip);
//3.獲取filter的所有配置參數(shù)的名字
Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();
while (initParameterNames.hasMoreElements()){
System.out.println("filterNames: " + initParameterNames.nextElement());
}
//4.獲取servletContext
ServletContext servletContext = filterConfig.getServletContext();
System.out.println("servletContext: " + servletContext);
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
public void destroy() {
}
}
2.web.xml
<filter>
<filter-name>filterConfig</filter-name>
<filter-class>filter.FilterConfig</filter-class>
<!--配置參數(shù)-->
<init-param>
<param-name>ip</param-name>
<param-value>12.344.123.12</param-value>
</init-param>
<init-param>
<param-name>qq</param-name>
<param-value>1721469477@qq.com</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filterConfig</filter-name>
<url-pattern>/abc/*</url-pattern>
</filter-mapping>
5.結(jié)果
3.課后練習(xí)
1.FilterConfig.java
package filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* @author 孫顯圣
* @version 1.0
*/
public class FilterConfig implements Filter {
public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {
//獲取filter配置參數(shù)
String ip = filterConfig.getInitParameter("ip");
//獲取servletContext
ServletContext servletContext = filterConfig.getServletContext();
//把禁用的網(wǎng)段放入servletContext
servletContext.setAttribute("ip", ip);
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
ServletContext servletContext = servletRequest.getServletContext();
Object ip = servletContext.getAttribute("ip");
if (ip != null) {
String ip_ = (String) ip; //獲取禁用網(wǎng)段ip
}
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
//獲取請求的ip
String remoteAddr = httpServletRequest.getRemoteAddr();
//使用正則表達式匹配
String regStr = ip + ".*";
if (!remoteAddr.matches(regStr)) {
//如果不是禁用網(wǎng)段跳轉(zhuǎn)到登錄頁面
httpServletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
}
}
public void destroy() {
}
}
2.結(jié)果
7.FilterChain
1.基本原理
2. 代碼實例
1.AFilter.java
package filter;
import javax.servlet.*;
import javax.servlet.FilterConfig;
import java.io.IOException;
/**
* @author 孫顯圣
* @version 1.0
*/
public class AFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("AFilter的前置代碼");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("AFilter的后置代碼");
}
public void destroy() {
}
}
2.BFilter.java
package filter;
import javax.servlet.*;
import javax.servlet.FilterConfig;
import java.io.IOException;
/**
* @author 孫顯圣
* @version 1.0
*/
public class BFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("BFilter的前置代碼");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("BFilter的后置代碼");
}
public void destroy() {
}
}
3.web.xml
<filter>
<filter-name>A</filter-name>
<filter-class>filter.AFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>A</filter-name>
<url-pattern>/aaa</url-pattern>
</filter-mapping>
<filter>
<filter-name>B</filter-name>
<filter-class>filter.BFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>B</filter-name>
<url-pattern>/aaa</url-pattern>
</filter-mapping>
4.結(jié)果
3.注意事項
8.作業(yè)練習(xí)
1.homeworkFilter.java
package filter;
import javax.servlet.*;
import javax.servlet.FilterConfig;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
/**
* @author 孫顯圣
* @version 1.0
*/
public class homeworkFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
//動態(tài)獲取評論,并將評論都放到servletContext中
ServletContext servletContext = filterConfig.getServletContext();
Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();
ArrayList<String> comments = new ArrayList<String>();
while (initParameterNames.hasMoreElements()) {
String s = initParameterNames.nextElement();
String initParameter = filterConfig.getInitParameter(s);
comments.add(initParameter);
}
servletContext.setAttribute("comments", comments);
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//獲取所有評論
ServletContext servletContext = servletRequest.getServletContext();
Object comments = servletContext.getAttribute("comments");
//獲取填寫的評論
String comment = servletRequest.getParameter("comment");
//沒有禁止的評論就直接放行
if (comments == null) {
filterChain.doFilter(servletRequest, servletResponse);
}
//禁止的評論不為空則遍歷判斷
ArrayList<String> coms = (ArrayList<String>) comments;
for (String com : coms) { //遍歷禁用詞
if (com.equals(comment)) {
//請求轉(zhuǎn)發(fā)到主頁面并將禁用詞傳進去
servletRequest.setAttribute("badComment", comment);
servletRequest.getRequestDispatcher("/topic.jsp")
.forward(servletRequest, servletResponse);
}
}
filterChain.doFilter(servletRequest, servletResponse);
}
public void destroy() {
}
}
2.web.xml
<filter>
<filter-name>homeworkFilter</filter-name>
<filter-class>filter.homeworkFilter</filter-class>
<init-param>
<param-name>com1</param-name>
<param-value>蘋果</param-value>
</init-param>
<init-param>
<param-name>com2</param-name>
<param-value>香蕉</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>homeworkFilter</filter-name>
<url-pattern>/showTopic.jsp</url-pattern>
</filter-mapping>
3.topic.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
Date: 2024/1/31
Time: 17:36
User: 孫顯圣
Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h4>敏感詞:蘋果、香蕉
<c:if test="${!empty requestScope.badComment}">
---有敏感詞:${requestScope.badComment}
</c:if>
</h4>
<form action="showTopic.jsp" method="get">
評論:<input type="text" name="comment"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
4.showTopic.jsp
<%--
Date: 2024/1/31
Time: 17:39
User: 孫顯圣
Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h4>您的評論是:<%=request.getParameter("comment")%></h4>
</body>
</html>
5.演示結(jié)果
文章來源:http://www.zghlxwxcb.cn/news/detail-854959.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-854959.html
到了這里,關(guān)于Java-Web過濾器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!