SpringMVC 拦截器

来源:互联网 发布:这个驸马有淘宝gl下载 编辑:程序博客网 时间:2024/05/16 12:27

这里写图片描述


拦截器

FirstInterceptor.java

package com.jxust.springmvc.interceptors;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;public class FirstInterceptor implements HandlerInterceptor {    /**     * 渲染视图之后被调用 ,释放资源     */    @Override    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)            throws Exception {        System.out.println("[FirstInterceptor] afterCompletion");    }    /**     * 调用目标方法之后,渲染视图之前     * 可以对请求域中的属性和视图作出修改     */    @Override    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)            throws Exception {        System.out.println("[FirstInterceptor] postHandle");    }    /**     * 该方法在目标方法之前被调用     * return true 则继续调用后续的拦截器和目标方法     * return false 当前和后续的拦截器都不会执行     * 可以考虑做权限,日志,事务等 ,乱码处理     */    @Override    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {        System.out.println("[FirstInterceptor] preHandle");        /*arg0.setCharacterEncoding("utf-8");//设置请求的字符编码        //对用户是否登录进行判断        if(arg0.getSession().getAttribute("user")==null){            //没有登录,跳转到login.jsp            arg0.getRequestDispatcher("/login.jsp").forward(arg0, arg1);;            return false;        }*/        return true;    }}

SecondInterceptor.java

package com.jxust.springmvc.interceptors;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;public class SecondInterceptor implements HandlerInterceptor {    /**     * 渲染视图之后被调用 ,释放资源     */    @Override    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)            throws Exception {        System.out.println("[SecondInterceptor] afterCompletion");    }    /**     * 调用目标方法之后,渲染视图之前     * 可以对请求域中的属性和视图作出修改     */    @Override    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)            throws Exception {        System.out.println("[SecondInterceptor] postHandle");    }    /**     * 该方法在目标方法之前被调用     * return true 则继续调用后续的拦截器和目标方法     * return false 当前和后续的拦截器都不会执行     * 可以考虑做权限,日志,事务等      */    @Override    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {        System.out.println("[SecondInterceptor] preHandle");        return true;    }}

拦截器配置

    .    .    <!--配置自定义的拦截器  -->        <mvc:interceptors>            <bean class="com.jxust.springmvc.interceptors.FirstInterceptor"></bean>            <!-- 配置拦截器(不)作用的路径 -->            <mvc:interceptor>                <mvc:mapping path="/emps"/>                <mvc:exclude-mapping path="/hello"/>                <bean class="com.jxust.springmvc.interceptors.SecondInterceptor"></bean>            </mvc:interceptor>        </mvc:interceptors>        .        .

return false ,则指定的方法(或所有)将不能执行

执行顺序

这里写图片描述

像收费站的模式,依次通过收费站1,收费站2,返回的时候,先通过收费站2,在通过收费站1,多个类似。

 3个方法的作用顺序,正序,反序,反序[FirstInterceptor] preHandle[SecondInterceptor] preHandle[SecondInterceptor] postHandle[FirstInterceptor] postHandle[SecondInterceptor] afterCompletion[FirstInterceptor] afterCompletion---------------------------------------------如果 SecondInterceptorpreHandlefalse[FirstInterceptor] preHandle[SecondInterceptor] preHandle[FirstInterceptor] afterCompletion如果其中一个拦截器设置了preHandlerreturn false,就不需要释放资源了return true的拦截器,需要释放资源

拦截器和过滤器的区别

  • 过滤器Filter依赖于Servlet容器,基于回调函数,过滤范围大,可以过滤请求和资源等
  • 拦截器Interceptor 依赖于框架容器,基于反射机制,只过滤请求

    拦截器的作用:可以处理Web应用中请求的一些通用性问题,共性问题在拦截器中处理,可以减少重复代码,便于维护

回调函数

⑴定义一个回调函数;
⑵提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;
⑶当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。

声明一个函数给调用者,发生特定条件时执行的某个行为,行为就是该声明的函数的执行。
之所以把函数交给调用者,主要是依靠它的特定功能(检测某个事件发生等等);商店买东西,没货,我留电话,到货通知我,就是类似的流程。

当程序跑起来时,一般情况下,应用程序(application program)会时常通过API调用库里所预先备好的函数。但是有些库函数(library function)却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务。这个被传入的、后又被调用的函数就称为回调函数(callback function)。…….

知乎https://www.zhihu.com/question/19801131

反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

动态语言的特点
程序运行时,允许改变程序结构或变量类型

0 0
原创粉丝点击