Filter过滤器

关键操作:配置以及放行

Day 1

从例子引入

输入张三

后台输出数据为中文乱码

 

解决方法

   req.setCharacterEncoding("UTF-8");

然而这个只能解决一个页面的,如果有很多个页面要用很多次

要避免重复代码

用过滤器去处理

 

过滤器Filter

一.功能:
1、⽤来拦截传⼊的请求和传出的响应。
2、修改或以某种⽅式处理正在客户端和服务端之间交换的数据流。
二.如何使⽤?
与使⽤ 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);  //是登录状态,则放行
 }
 }
}

 

posted @ 2021-01-28 10:30  Hanabi_521  阅读(72)  评论(0编辑  收藏  举报