Filter功能
- 用来拦截传入请求和传出响应
- 修改或以某种方式处理服务端和客户端之间交换的数据流
- 统一处理中文乱码
- 屏蔽敏感词
- 控制资源的访问权限
Filter生命周期
打不过tomcat启动时,通过反射机制调用filter的无参构造函数创建实例化对象,同时调用init方法实现初始化,doFilter方法会调用多次,当tomcat关闭时,调用destroy方法,销毁filter对象
- 无惨构造函数:只调用一次,当tomcat启动时调用
- init方法:只调用一次,当filter的实例化对象创建完成后调用
- doFilter:调用多次,访问Filter的业务逻辑都卸载Filter中
- destory:只调用一次,Tomcat关闭时调用
执行顺序
当同时配置多个Filter时,filter的执行顺序由web.xml的顺序决定,此时注解形式无法决定filter的执行顺序
如何使用Filter处理中文乱码
与Servlet类似,Filter是javaWeb提供的一个接口,开发者只需要自定义一个类并且实现该接口即可
代码:
package Filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/login123")
public class CharacterFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("UTF-8");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
其继承的是Servlet中的filter,不要选错了
而且这个filter有两个默认方法,可以不用实现(java1.8以后的特性)
这个filter是针对字符集乱码的问题,以往我们需要在request中设置编码格式
而当页面很多时,每个都要写就很低效
所以就可以把这个设置编码格式的工作交给filter
前端代码如下
如果我们写中文传递过去
后端这里会输出乱码
所以需要filter来进行编码过滤
其中filter是自带请求中断功能,所以必须设置
filterChain.doFilter(servletRequest,servletResponse);
这个语句方便请求响应继续传递
以上是基于注解的形式
如果想在配置文件里面配置,则可以用
<filter>
<filter-name>character</filter-name>
<filter-class>Filter.CharacterFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>character</filter-name>
<url-pattern>/login</url-pattern>
</filter-mapping>
其中url就是你想要截获的地址,如果有多个地址需要截获,多写几行即可
如何使用Filter处理敏感词
前端jsp如下
其提交后跳转到映射成 /word 的servlet中
过滤器对 /word 进行拦截
package Filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/word")
public class WorldFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("UTF-8");
String name = servletRequest.getParameter("name");
name = name.replace("敏感词","****");
servletRequest.setAttribute("name",name);
filterChain.doFilter(servletRequest,servletResponse);
}
}
Filter控制资源访问权限
对于某些需要权限的地方,比如说想下载,但必须是会员,那么我们就可以使用Filter来过滤,看是否有对应的权限
核心思路:
请求访问download页面时,Filter文件检查是否已经登录,,比如用户数据存储在session中,Filter就检查session是否存在用户,存在就放行,让请求继续访问download页面,不存在用户则跳转到login页面
下载页面
普普通通的下载页面,访问地址是/download.jsp
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="/">资源1</a>
<a href="/">资源2</a>
<a href="/">资源3</a>
</body>
</html>
过滤器
拦截访问/download.jsp的请求,并且判断是否登录用户,登录则放行,没有则跳转到登录页面
package Filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebFilter("/download.jsp")
public class ConfirmFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;//用子类继承父类对象,用于获取session
HttpServletResponse response = (HttpServletResponse) servletResponse;//用于跳转页面
HttpSession session = request.getSession();//获取session,用于检查是否存在用户(用户是否登录)
String name = (String) session.getAttribute("name");
if(name!=null){
//已经有用户登录,则放行
filterChain.doFilter(servletRequest,servletResponse);
}else {
//不存在用户,则跳转到登录界面
response.sendRedirect("/test.jsp");
}
}
}
登录页面和审核页面
映射地址为/tesst.jsp用于引导用户输入账号密码
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/login123" method="post">
<input type="text" name="name">
<input type="password" name="password">
<input type="submit" value="提交">
</form>
</body>
</html>
servlet页面用于验证登录信息,如果确认则跳转到下载页面,并且用户信息存入sess
不是则继续登录
package Servlet;
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 ConfirmServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
String password = req.getParameter("password");
if(name.equals("admin") && password.equals("password")){
resp.sendRedirect("/download.jsp");
}else {
resp.sendRedirect("/test.jsp");
}
}
}