ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Fliter--过滤器

2019-06-27 21:00:06  阅读:247  来源: 互联网

标签:请求 request 用户 Filter Fliter 过滤器 Servlet


过滤器的概念:

过滤器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("............过滤器打开...........");

    }

}

 

标签:请求,request,用户,Filter,Fliter,过滤器,Servlet
来源: https://www.cnblogs.com/fbbg/p/11099551.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有