Filter过滤器
关键操作:配置以及放行
Day 1
从例子引入
输入张三
后台输出数据为中文乱码
解决方法
req.setCharacterEncoding("UTF-8");
然而这个只能解决一个页面的,如果有很多个页面要用很多次
要避免重复代码
用过滤器去处理
过滤器Filter
一.功能:
1、⽤来拦截传⼊的请求和传出的响应。
2、修改或以某种⽅式处理正在客户端和服务端之间交换的数据流。
![](https://img2020.cnblogs.com/blog/1698402/202101/1698402-20210128095351035-1829910713.png)
二.如何使⽤?
与使⽤ Servlet 类似,Filter 是 Java WEB 提供的⼀个接⼝,开发者只需要⾃定义⼀个类并且实现该接⼝
注意引 javax 的包
代码
(处理中文乱码)
public class CharacterFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("UTF-8"); filterChain.doFilter(servletRequest,servletResponse); }}
在web.xml中配置
注意:doFilter ⽅法中处理完业务逻辑之后,必须添加
fifilterChain.doFilter(servletRequest,servletResponse);//相当于放行
否则请求/响应⽆法向后传递,⼀直停留在过滤器中。
<filter> <filter-name>character</filter-name> <filter-class>com.filter.ChracterFilter</filter-class> </filter> <filter-mapping> <filter-name>character</filter-name> <url-pattern>/login</url-pattern>//要让啥页面过滤,就配它
<url-pattern>/test</url-pattern> </filter-mapping>
配了之后访问,结果名字都没输出出来
原因:
过滤器将请求暂停了,需要放行
解决方法
filterServlet中加一行
filterChain.doFilter(servletRequest,servletResponse);
结果:
有中文输出了
(Day 2)Filter的生命周期
(联系Servlet)
当 Tomcat 启动时,通过反射机制调⽤ Filter 的⽆参构造函数创建实例化对象,同时调⽤ init ⽅法实现
初始化,doFilter ⽅法调⽤多次,当 Tomcat 服务关闭的时候,调⽤ destory 来销毁 Filter 对象。
⽆参构造函数:只调⽤⼀次,当 Tomcat 启动时调⽤(Filter ⼀定要进⾏配置)
init ⽅法:只调⽤⼀次,当 Filter 的实例化对象创建完成之后调⽤
doFilter:调⽤多次,访问 Filter 的业务逻辑都写在 Filter 中
destory:只调⽤⼀次,Tomcat关闭时调用
配置
有顺序要求:用web.xml
同时配置多个 Filter,Filter 的调⽤顺序是由 web.xml 中的配置顺序来决定的,写在上⾯的配置先调⽤,因为 web.xml 是从上到下顺序读取的。
无顺序要求:
@WebFilter("/download.jsp")
和servlet配置类似
实际开发中 Filter 的使⽤场景:
1、统⼀处理中⽂乱码。(Day1)
2、屏蔽敏感词。
3、控制资源的访问权限。
2.
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //将 敏感词 替换成 *** servletRequest.setCharacterEncoding("UTF-8"); String name=servletRequest.getParameter("name"); name=name.replaceAll("敏感词","***"); filterChain.doFilter(servletRequest,servletResponse); }
结果:
在TestServlet中访问,name仍然没改
原因:黄色行改的是副本
如何存回去
servletRequest.setAttribute("name",name);
servletRequest.getAttribute("name",name);
用这个方法
3.
控制资源访问
思路:该过滤器实现通过session里有无信息判断用户是否登录,若登录,则放行,若未登录就跳转到登录界面
@WebFilter("/download.jsp") //待放行页面 public class DownloadFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; //下转了才能用session HttpSession session = request.getSession(); String name = (String) session.getAttribute("name"); if(name == null){ //不是登录状态 response.sendRedirect("/login.jsp"); }else{ filterChain.doFilter(servletRequest,servletResponse); //是登录状态,则放行 } } }