精华内容
下载资源
问答
  • 多个过滤器执行顺序

    千次阅读 2019-12-10 20:23:39
    多个过滤器执行顺序 一个目标资源可以指定多个过滤器,过滤器的执行顺序是在web.xml文件中的部署顺序。 我们演示一下: 我们建立两个filter: AFilter: public void doFilter(ServletRequest request, Servlet...

    多个过滤器的执行顺序

    一个目标资源可以指定多个过滤器,过滤器的执行顺序是在web.xml文件中的部署顺序。

    我们演示一下:
    我们建立两个filter:
    AFilter:

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    	System.out.println("filter start...这里是AFilter");
    	chain.doFilter(request, response);
    }
    

    BFilter:

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    	System.out.println("filter start...这里是BFilter");
    	chain.doFilter(request, response);
    }
    

    web.xml中进行的配置,我们把AFilter放在上面,BFilter放在下面:

    <filter>
    	<display-name>Afilter</display-name>
    	<filter-name>Afilter</filter-name>
    	<filter-class>com.veeja.web.filter.Afilter</filter-class>
    </filter>
    <filter-mapping>
    	<filter-name>Afilter</filter-name>
    	<url-pattern>/index.jsp</url-pattern>
    </filter-mapping>
    
    
    <filter>
    	<display-name>BFilter</display-name>
    	<filter-name>BFilter</filter-name>
    	<filter-class>com.veeja.web.filter.BFilter</filter-class>
    </filter>
    <filter-mapping>
    	<filter-name>BFilter</filter-name>
    	<url-pattern>/index.jsp</url-pattern>
    </filter-mapping>
    

    我们现在访问一下index.jsp,看一下过滤器执行的顺序是怎么样的:
    在这里插入图片描述
    我们可以看到,先访问的是AFilter,再访问的是BFilter。

    接下来我们变更一下Filter的顺序,我们把BFilter的filter-mapping放在AFilter的上面:
    在这里插入图片描述
    我们现在访问一下index.jsp,看一下过滤器执行的顺序:
    在这里插入图片描述
    我们可以看到,这次先执行的是BFilter,后执行的是AFliter。
    也就是说,过滤器的执行顺序,取决于过滤器在xml中的部署顺序,而且仅仅取决于xml中filter-mapping的顺序。


    以上就是全部内容,谢谢你的阅读。

    如有纰漏,请不吝指出,不胜感激。

    如果你不沉下心来认真练习,所有的阅读都是白费的。

    展开全文
  • 1、自定义过滤器 过滤器类实现 javax.servlet....@Order(int) 注解,配合 @WebFilter 注解使用,用于多个过滤器时定义执行顺序,值越小越先执行。 2、添加 @ServletComponentScan 注解 在启动类上加一个注解 ...

    1、自定义过滤器

    过滤器类实现 javax.servlet.Filter。然后添加注解 @WebFilter(filterName=“过滤器名称” urlPatterns=“过滤规则” )
    @Order(int) 注解,配合 @WebFilter 注解使用,用于多个过滤器时定义执行顺序,值越小越先执行。

    2、添加 @ServletComponentScan 注解

    在启动类上加一个注解 @ServletComponentScan(basePackages=“需要扫描的过滤器”)

    3、多个过滤器如何指定执行顺序?

    使用@Order注解来设置过滤器的执行顺序,是无效的!

    使用@Order注解指定一个int值,越小越先执行。很多博客文章都是这么说的,但你真正的试了吗?真的可以使用这个注解指定顺序吗?答案是否定的。

    经过测试,发现 @Order 注解指定 int 值没有起作用,是无效的。为啥?因为看源码发现 @WebFilter 修饰的过滤器在加载时,没有使用 @Order 注解,而是使用的类名来实现自定义Filter顺序
    所以这种方式下想定义Filter的顺序,就必须限定 Filter 的类名,比如刚才那个 Filter 叫 Filter01,假如我们现在新写了一个 Filter 叫 Filter02,那么顺序就是 Filter01> Filter02。

    所以这种方式虽然实现起来简单,只需要注解,但自定义顺序就必须要限定类名,使用类名达到排序效果了。

    4、配置多个过滤器的执行顺序

    @Configuration
    public class FilterConfig{
    
    	@Bean
    	public FilterRegistrationBean Filter01(){
    		FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean();
    		filterRegistrationBean.setFilter(new Filter01());//设置过滤器名称
    		filterRegistrationBean.addUrlPatterns("/*");//配置过滤规则
    		filterRegistrationBean.setOrder(1); //order的数值越小 则优先级越高
    		return filterRegistrationBean;
    	}
    	@Bean
    	public FilterRegistrationBean Filter02(){
    		FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean();
    		filterRegistrationBean.setFilter(new Filter02());
    		filterRegistrationBean.addUrlPatterns("/*");
    		filterRegistrationBean.setOrder(2);
    		return filterRegistrationBean;
    	}
    
    }
    
    展开全文
  • 配置图文,超详细!!SpringMVC拦截器Interceptor详解,多个拦截器的执行顺序,拦截器进行权限判断和日志记录,拦截器和过滤器的区别

    SpringMVC拦截器

      Interceptor拦截器,是SpringMVC提供用来拦截发送给Controller层方法请求的拦截器。类似于filter 主要进行记录日志,判断用户是否登录,过滤权限(没有登录就跳转登录之类的)
      拦截器和我们所学的过滤器是很相似的,只是范围不一样。

    • 过滤器filter:是JavaEE提供的用来拦截所有的请求,进行过滤,它主要用于实现编码过滤,进行统一编码,防止乱码。
    • 拦截器interceptor:主要用来拦截Controller控制器的方法,一般用于拦截Controller层,满足条件才放行,主要用于实现权限分配,不满足条件不能访问一些界面(比如登录才能进入)。

    【注意】一般请求都是先通过过滤器filter过滤,才会被拦截器interceptor处理,决定是否放行,两个过程有任何一个不放行,都不能访问到Controller层方法。

    1. 过滤器和拦截器的大概执行流程【***】

    在这里插入图片描述

    2. 拦截器的三个方法

    1. boolean preHandle():在访问controller方法之前执行,返回为true才会去执行Controller方法,返回false,就被拦截了,原路打回(主要做权限控制,有权限才放行)。
    2. void postHandle():在执行controller方法之后执行jsp页面之前执行该方法,可以向作用域中放入数据,影响jsp展示效果,(可以在执行jsp之前做渲染)
    3. void afterCompletion在jsp页面渲染完成之后执行,(主要用于记录日志,资源释放
      ,
      【注意小知识点来啦】如果preHadle返回true,但是没有找到对应的Controller,是不会执行postHandle方法哦。

    差不多就是这样的模板

    public class MyInterceptor implements HandlerInterceptor {
    
    //    在访问controller方法之前执行
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            //prehandle:访问controller之前执行,返回true 继续访问controller。
            System.out.println("\n----------AuthInterceptor 【preHandle】--------------");
            return true;//返回false就不再继续执行controller方法
        }
    
    //    如果没有controller就不执行postHandle方法
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    		//posthandle:在执行controller方法之后, 执行jsp之前执行该方法,可以向作用域中放入数据,影响jsp展示效果,(可以执行jsp之前做渲染)
            System.out.println("----------AuthInterceptor 【postHandle】-------------- ");
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            //afterCompletion:在jsp渲染之后执行,用于记录日志,资源释放
            System.out.println("----------AuthInterceptor 【afterCompletion】--------------");
    
    		//记录日志  向文件里面写日志
            String logdir = request.getServletContext().getRealPath("log");//获取服务器记录日志log文件所存放的目录位置 -- tomcat下的真实路径+log目录
            //路径不存在就创建
            Path logdirPath = Paths.get(logdir);
            if(Files.notExists(logdirPath)){
                Files.createDirectories(logdirPath);
            }
            //目录存在就将数据[字符]写入
            Path logfile = Paths.get(logdir,"userlog.log");//存放日志的路径+文件名
            BufferedWriter writer = new BufferedWriter(new FileWriter(logfile.toFile(),true));//logfile.toFile() paths转换为File类型 true以追加的方式写入
    		
    		//获取登录用户信息
            Users user = (Users)request.getSession().getAttribute("user");
            String username = user.getUsername();
            //记录user登录时间,存入日志
            String message = username+" 登录时间:"+new Date();
            writer.write(message+"\r\n");
            writer.flush();
            writer.close();
        }
    }
    

    3. 多个拦截器的执行顺序

    如果所有拦截器都通过(都不拦截)执行顺序是这样的:
    (都执行的话,preHandle顺序执行,postHandler逆序执行,最后再afterCompletion逆序执行)
    在这里插入图片描述
    如果拦截器1拦截(也就是preHandle1返回false),那么后面的拦截器也不执行,直接原路打回。
    在这里插入图片描述
    如果拦截器3拦截,那么也不执行controller方法,大概是这样的。
    在这里插入图片描述


    4. SpringMVC拦截器的配置

    4.1 自定义拦截器,实现HandlerInterceptor接口

    //实现一个接口HandlerInterceptor
    public class Demo01Interceptor  implements HandlerInterceptor {
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("preHandle");
            return true;//放行执行controller
        }
    
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        
        }
    
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
        }
    }
    

    4.2 springmvc.xml配置拦截器

    配置多个拦截器

    <!-- /** 是拦截所有的请求   path="/interceptor"只拦截interceptor路径-->
         <mvc:interceptors>
             <mvc:interceptor>
             	<!-- /**拦截所有请求,配置全局拦截器 -->
                 <mvc:mapping path="/**"/>
                 <bean class="com.xgf.springmvc.ajax.interceptor.AuthInterceptor"/>
             </mvc:interceptor>
             <mvc:interceptor>
             	<!-- /interceptor 之拦截interceptor该路径 -->
                 <mvc:mapping path="/interceptor"/>
                 <bean class="com.xgf.springmvc.ajax.interceptor.AuthInterceptor1"/>
             </mvc:interceptor>
         </mvc:interceptors>
    

    5. 案例:用户权限拦截器和日志记录

    有些页面只有用户登录才能访问,未登录不能访问。

    5.1 案例图解【***】

    在这里插入图片描述
    浏览器进行访问,想去购物车模块/订单模块需要先进行用户登录,用户权限拦截器进行判断用户登录没有,登录成功,放行,可以访问。未登录,拦截,跳转登录界面。

    5.2 用户权限拦截器UserAuthInterceptor

    作用:判断访问路径,如果访问的是order订单模块或者cart购物车模块.就需要判断用户是否登录,读取session中的用户信息,未登录强制跳转到登入页面,登录就放行,进入相应页面

    public class UserAuthInterceptor implements HandlerInterceptor {
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("UserAuthInterceptor preHandle------------------------");
            User user = (User) request.getSession().getAttribute("user");
            if(user == null){//未登录才判断,登录了直接放行
                String address = request.getRequestURI();//获取路径
                System.out.println("address = "+address);
                //是购物车或者订单页面,就直接跳转登录界面
                if(address.contains("order")||address.contains("cart")){
    	            //强制到登录页面
                    response.sendRedirect(request.getContextPath() + "/login.jsp");
                    //设置为false,不访问controller
                    return false;
                }
            }
            //其它模块或者已经登录,就直接放行
            return true;
        }
    
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("UserAuthInterceptor postHandle------------------------");
        }
    
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("UserAuthInterceptor afterCompletion------------------------");
            
    		//记录日志  向文件里面写日志
            String logdir = request.getServletContext().getRealPath("log");//获取服务器记录日志log文件所存放的目录位置 -- tomcat下的真实路径+log目录
            //路径不存在就创建
            Path logdirPath = Paths.get(logdir);
            if(Files.notExists(logdirPath)){
                Files.createDirectories(logdirPath);
            }
            //目录存在就将数据[字符]写入
            Path logfile = Paths.get(logdir,"userlog.log");//存放日志的路径+文件名
            BufferedWriter writer = new BufferedWriter(new FileWriter(logfile.toFile(),true));//logfile.toFile() paths转换为File类型 true以追加的方式写入
    		
    		//获取登录用户信息
            Users user = (Users)request.getSession().getAttribute("user");
            String username = user.getUsername();
            //记录user登录时间,存入日志
            String message = username+" 登录时间:"+new Date();
            writer.write(message+"\r\n");
            writer.flush();
            writer.close();
        }
    }
    
    

    5.3 OrderController订单controller

    订单模块

    @Controller
    @RequestMapping("/toOrder")
    public class OrderController {
        @RequestMapping(path = "/orderInfo.action",method = {RequestMethod.GET,RequestMethod.POST})
        public String query(Integer id){
            System.out.println("订单信息");
            return "order";
        }
    }
    

    5.4 CartController购物车controller

    购物车模块

    @Controller
    @RequestMapping("/toCart")
    public class OrderController {
        @RequestMapping(path = "/cartInfo.action",method = {RequestMethod.GET,RequestMethod.POST})
        public String query(Integer id){
            System.out.println("购物车信息");
            return "cart";
        }
    }
    

    5.5 springmvc中配置拦截器

       <!--配置用户权限拦截器-->
        <mvc:interceptors>
            <!--用于测试的拦截器-->
            <mvc:interceptor>
                <!--拦截路径的配置 /**拦截所有请求 -->
                <mvc:mapping path="/**"/>
                <bean id="interceptor1" class="com.xgf.interceptor.UserAuthInterceptor"/>
            </mvc:interceptor>
    	<!-- 可以配置多个拦截器,继续用mvc:interceptor-->
        </mvc:interceptors>
    

    大佬们,画图不容易啊,给个关注给个赞呗,感谢感谢=

    展开全文
  • 1、首先,过滤器是有一@Order()的注解,参数值越低,执行顺序越靠前,但是在我测试之后,发现并没有成功,过滤器依旧是按照名称的顺序先后执行,那么我们就只能通过编写config文件来决定执行顺序 @Configuration...

    1、首先,过滤器是有一个@Order()的注解,参数值越低,执行顺序越靠前,但是在我测试之后,发现并没有成功,过滤器依旧是按照名称的顺序先后执行,那么我们就只能通过编写config文件来决定执行顺序

    @Configuration
    public class FilterConfig {
    
        @Bean
        public FilterRegistrationBean pathFilter(){
            FilterRegistrationBean registrationBean = new FilterRegistrationBean(new DecodeFilter());
            registrationBean.addUrlPatterns("/*");
            return registrationBean;
        }
    
        @Bean
        public FilterRegistrationBean jwtFilter(){
            FilterRegistrationBean registrationBean = new FilterRegistrationBean(new AbstractFilter());
            registrationBean.addUrlPatterns("/*");
            return registrationBean;
        }
    
        @Bean
        public FilterRegistrationBean decodeFilter(){
            FilterRegistrationBean registrationBean = new FilterRegistrationBean(new HelpFilter());
            registrationBean.addInitParameter("", "");
            registrationBean.addUrlPatterns("/*");
            return registrationBean;
        }
    
    }

    2、过滤器文件,如果按照正常来讲,执行顺序会是,ab—》de—》he

    3、但是当我设置了config文件后,在执行

    4、之后我们就可以将所有注解都去掉了,除了config文件中的注解

    展开全文
  • 当有多个过滤器的时候,我们要遵循以下两条原则来进行过滤器的匹配。  1. 首先如果有URL的形式,先进行匹配,当有多个URL被匹配到的时候按照DD(部署描述文件)中的顺序执行过滤器。  2. 当
  • Shiro内部过滤器执行顺序

    千次阅读 2020-07-29 21:32:22
    FormAuthenticationFilter ... 通过第一篇,我们已经知道shrio是如何从Spring MVC中接管web请求的,并且循环调用配置的filters,接下来先看一张filter...调用doFilterInternal(),真正执行fiter认证流程,执行剩余的fil
  • 本来想记录一下关于用户登陆和登陆之后的权限管理、菜单管理的问题,想到解决这问题用到Interceptor,但想到了Interceptor,就想到了Filter,于是就想说一下它们的执行顺序和区别。关于Interceptor解决权限和菜单...
  • 2、@Component和@Order(可选,有多个过滤器时可添加)注解,@Order用于控制过滤器的级别,值越小级别越高 3、过滤的业务逻辑写在doFilter()方法中。 备注:请求的编码格式设置建议直接写在application.yml配置...
  • jsp过滤器执行顺序

    千次阅读 2010-01-19 11:38:00
    在一个大型项目中往往有多个servlet过滤器,但是这些servlet过滤器执行顺序是怎样的呢? 项目中关于SSH2中OpenSessionInViewFilter的学习研究,测试Filter的先后顺序!!请看一下例子: 创建两个简单的servlet...
  • 解决springboot整合shiro后过滤器执行顺序的问题 主要是Springboot 把过滤器变成了全局过滤器,不属于shiro内部的过滤器。shiroFilter 集成了过滤器filterchain 模式的; 1.问题如下:springboot 整合shiro 后...
  • 拦截器与过滤器执行顺序和区别

    千次阅读 2019-07-15 14:32:00
    1、过滤器(Filter) 首先说一下Filter的使用地方,我们在配置web.xml时,总会配置下面一段设置字符编码,不然会导致乱码问题: <filter> <filter-name>encoding</filter-name> <filter-...
  • Filter过滤器执行顺序

    千次阅读 2019-05-24 20:53:43
    Web应用允许多个过滤器来过滤页面请求——联想现实生活中的例子是最好理解的啦!比如:为了获得更加干净的水,可能需要多个过滤器来进行过滤。 这个时候就分为两种情况了 1:多个过滤器过滤的URL不同,那么此时的...
  • spring cloud gateway过滤器执行顺序

    万次阅读 2019-09-19 16:13:24
    一、图谱 在Spring-Cloud-Gateway之请求处理流程中最终网关是将请求交给过滤器链表进行处理。...现在流行的微服务,整个项目包含很多个服务,如果没有网关这层,那么我们通过什么方式来限制访问呢?难道在每个服...
  • springmvc的拦截实现HandlerInterceptor接口后,会有三抽象方法需要实现,分别为方法前执行preHandle,方法后postHandle,页面渲染后afterCompletion。 1、当俩拦截都实现放行操作时,顺序为preHandle 1,...
  • 过滤器 拦截器 service 执行顺序

    千次阅读 2016-08-08 14:25:56
    由于最近做的项目中有一部分是接口远程调用,用到了接入权限和业务权限的鉴定,需要采用SpringMVC的拦截器,以前用Struts2的时候用过拦截器,而...因为过滤器和拦截器有很相似甚至相同的地方,因为很时候二者都能
  • 过滤器和拦截器的区别和执行顺序

    千次阅读 2018-07-16 14:51:07
    它提供了一种机制可以使开发者可以定义在一action执行的前后执行的代码,也可以在一action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截...
  • 1.过滤器配置 自定义过滤器步骤: 1.在启动类上添加@ServletComponentScan注解进行servlet组件扫描 2.编写自定义过滤器类并实现Filter接口 3.使用@WebFilter(urlPatterns = “/user/*”)注解,注解过滤器类并表明...
  • 当项目中有多个filter时,为了便于管理,可以创建一个配置文件...如下:新建一个配置文件ComponentFilterOrderConfig.java先生成一个过滤器的bean,再把过滤器的bean注入到FilterRegistrationBean中,并设置一些属性...
  • 多个过滤器拦击饿同一个目标资源 一个目标资源可以指定多个过滤器,过滤器的执行顺序是由web.xml文件中的&lt;filter-mapping&gt;&lt;/filter-mapping&gt;的部署顺序决定的。一定要注意的是,那个...
  • 在Servlet3.0之前我们是在xml文件中配置过滤器的,执行顺序是哪个在前面,就先执行哪个。 在3.0之后新增@WebFilter注解,该方式过滤不用去xml文件中配置就可以使用,但是配置多个Filter时,执行的先后顺序是什么呢?...
  • Zuul的核心是一系列的过滤器,这些过滤器可以完成以下功能: 身份认证与安全:识别每资源的验证要求,并拒绝那些与要求不符的请求。 审查与监控:在边缘位置追踪有意义的数据和统计结果,从而带来精确的生成视图...
  • shiro过滤器,web.xml中默认访问页面以及springMVC拦截器执行顺序及shiroFilter部分参数含义
  • 在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤...
  • 一:拦截器 :是在面向切面编程的就是在你...二: 过滤器:是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数, 然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉...
  • Filter过滤器链(多个过滤器

    千次阅读 2020-01-21 13:57:47
    当有多个过滤器的时候,执行顺序很重要,在注解开发中,其执行顺序跟其类名的字符串有关,小的先执行,这里演示,一个是AFilter另一个是BFilter,如果是web.xml配置,那就是配置在上面的先执行 搞清楚了谁先执行,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 157,139
精华内容 62,855
关键字:

多个过滤器的执行顺序