Filter过滤器
过滤器,我们可以联想下生活中的净水器、空气净化器
web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能;一般用于完成通用的操作。如:统一编码处理、敏感字符过滤,权限登录…
执行流程
1、客户端发出请求,只有通过了过滤器才能进入servlet层
2、如果有多个过滤器要按照web.xml中注册的映射的顺序执行,只要其中有一个没有通过,客户端的请求就不会到servelet层
Filter开发步骤:
1、导包(继承Filter的接口)
public class CharacterEncodingFilter implements Filter
2、编写过滤器(实现Filter接口,重写doFilter的方法)
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
chain.doFilter(request,response);
}
@Override
public void destroy() {
}
}
chain.doFilter(request,response);
这代码是让我们的请求继续走,如果不写的话,程序到这里就被拦截停止了。至于为什么这个代码可以让程序循环的运行,我们按Ctrl 点击进入 FilterChain 的源码就都明了。(其实就是doFilter方法的循环调用)
在web.xml中配置 Filter
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<!--CharacterEncodingFilter拦截器的地址-->
<filter-class>com.zcm.filter.CharacterEncodingFilter</filterclass>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!--只要是 /servlet的任何请求,会经过这个过滤器-->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
拦截路径
/index.jsp
:只有访问index.jsp时,过滤器才会执行。
/jsp/*
:访问jsp下的所有资源时,过滤器就会被执行。
/*.do
:访问所有后缀名为do的资源时,过滤器都会被执行。
/*
:访问所有资源时,过滤器都会被执行。
Filter示例
LogFilter.class
登录拦截器
package com.zcm.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LogFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
if (req.getSession().getAttribute("username")==null){
resp.sendRedirect("error.jsp");
}
chain.doFilter(request,response);
}
@Override
public void destroy() {
}
}
HelloFilter.class
字符拦截器,将所有的请求和响应都转为中文
package com.zcm.filter;
import javax.servlet.*;
import java.io.IOException;
public class HelloFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter 初始化");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charest=UTF-8");
// request.setCharacterEncoding("gbk");
// response.setCharacterEncoding("gbk");
System.out.println("Filter 执行前");
chain.doFilter(request,response);
System.out.println("Filter 执行后");
}
@Override
public void destroy() {
System.out.println("Filter 销毁");
}
}
servlet的request.class
当username="admin"和password="123456"时进入success.jsp
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 request extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
if (username.equals("admin") && password.equals("123456")){
req.getSession().setAttribute("username",username);
req.getSession().setAttribute("password",password);
resp.sendRedirect("success.jsp");
}else {
resp.sendRedirect("error.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
xml 部署拦截器
<filter>
<filter-name>requestfilter</filter-name>
<filter-class>com.zcm.filter.HelloFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>requestfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>LogFilter</filter-name>
<filter-class>com.zcm.filter.LogFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<url-pattern>/success.jsp</url-pattern>
</filter-mapping>
只有登录成功时进入success.jsp,如果直接访问success.jsp 就会被拦截,重定向到error.jsp页面上
index.jsp
<html>
<body>
<h2>Hello World!</h2>
<hr>
<form action="${pageContext.request.contextPath}/hello" method="post">
username:<input type="text" name="username" placeholder="username">
password:<input type="password" name="password" >
<input type="submit" value="request">
</form>
</body>
</html>
error.jsp
ntentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Error</h1>
<a href="index.jsp">Back</a>
</body>
</html>
success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Success</h1>
<a href="${pageContext.request.contextPath}/logout">注销</a>
</body>
</html>
<%@ page co
大家可以自己试一试哈
有什么疑问可以写在评论区