Fliter--过滤器

过滤器的概念:

过滤器JavaWeb三大组件之一(servlet,listener,filter),它与Servlet很相似!不过过滤器是用来拦截请求的,而不是处理请求的。

当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“放行”,那么会继承执行用户请求的Servlet;如果Filter不“放行”,那么就不会执行用户请求的Servlet。

其实可以这样理解,当用户请求某个Servlet时,Tomcat会去执行注册在这个请求上的Filter,然后是否“放行”由Filter来决定。可以理解为,Filter来决定是否调用Servlet!当执行完成Servlet的代码后,还会执行Filter后面的代码。

用户在发送请求,tomcat服务器拿到请求后,执行对应的servlet,给用户响应内容。有了过滤器后,用户发送请求,服务器tomcat接受到请求后,先执行过滤器,然后再去执行servlet

Filter:在执行用户请求的资源之前,会先执行过滤器,若过滤器放行的话,才会执行用户请求的资源,若过滤器没有放行,则用户请求的资源就无法执行了。

使用场景:

1、未登录用户的拦截

2、集中代码的切入(中文乱码问题的集中处理)

3、统计程序代码的执行效率

 

 Filter作用

 

   1:可以拦截请求(request)

 

   2:也可以拦截响应(response)

 

   3:放行,同意通过连接器

 

   4:统计

 

如何创建一个filter

 

   1:实现一个接口 filter

 

   2:在web.xml中注册或在Filter中使用注解的方式@WebFliter("/*"),下边例子中使用注解的方式

在web.xml文件中进行配置
<filter>
    <display-name>FilterDemo1</display-name>
    <filter-name>FilterDemo1</filter-name>
    <filter-class>com.aaa.filter.LoginFilter</filter-class>

</filter>
<filter-mapping>
    <filter-name>FilterDemo1</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

 

对用户是否登录进行拦截

package com.aaa.Fliter;

import javax.servlet.*;
import javax.servlet.Filter;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

//采用注解方式配置:拦截所有请求                                           
@WebFilter("/*")                                                                                    
public class Filter2 implements Filter {
    public void destroy() {
       System.out.println("...........过滤器销毁.........");
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //先将req和resp转换成HttpServlet类型
       HttpServletRequest request=(HttpServletRequest) req;
       HttpServlerResponse response=(HttpServletResponse) resp;

       //获取session中的对象(user)判断是否为null
       Object user=request.getSession().getAttribute("user");
       if(user!=null){
          //user不为空说明已经登录,放行
         chain.dofilter(request,response);
          }else{
          //user为空说明没有登录,跳转到登录界面,但是并不是所有的请求都要拦截,在这里还要去除一些,像请求登录界面,调用登录功能
           String  strs[]={"login.jsp","LS"};
          //获取用户请求路径,然后判断用户请求路径中是否包含strs[]中的路径,如果包含就放行
           String requestURI=request.getRequestURI();//得到请求的路径
           //requestURI.contains("login.jsp");
           // contanins:包含的判断,判断requestURI中的路径是否包含括号中的路径,如果有返回true,如果没有返回false
            boolean tag=false;//利用tag的值判断是否拦截本此请求
            //利用加强型for循环来对strs[]进行遍历
            for(String str:strs){
                  if(request.contains(str)){
                        tag=true;
                        break;//tag为true时,跳出循环,因为已经匹配上资源了
                      }
               }
             //通过对tag的判断来看是否拦截此次请求
             if(tag){
                    chain.doFilter(request,response);
               }else{
                 response.sendRedirect("/lizzhen626/views/login.jsp(登录界面的项目路径)");
               }
           }
      }

    public void init(FilterConfig config) throws ServletException {
       System.out.println("............过滤器打开...........");

    }

}

 

上一篇:深度学习_用LSTM构建单词纠错神器(3)


下一篇:leetcode(80)_1592_easy_重新排列单词间的空格_python