springmvc拦截器

看了慕课网springmvc拦截器的课程,做一些笔记;
链接:http://www.imooc.com/learn/498

拦截器和过滤器区别

1. 拦截器基于springmvc框架,过滤器基于servlet;
2. 拦截器只能拦截请求,过滤器可以过滤所有资源;
3. 拦截器可以理解为特殊的过滤器

拦截器实现

创建拦截器对应类,并实现org.springframework.web.servlet.HandlerInterceptor接口;
该接口有三个接口方法需要实现:
1. boolean preHandle(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,Object o);
preHandle方法在接收到请求后执行,可以通过boolean返回值来决定是否拦截请求(true 表示请求继续往后台发送,false表示请求被截断,不再继续往后台进行)

2. public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,Object o, ModelAndView modelAndView)
postHandle 方法在请求没有被截断,且请求被后台对应方法处理后执行,该方法可以修改请求的内容:如修改request、reqponse的内容,还可以修改modelAndView中的数据,对model数据和view视图的跳转进行修改(通过参数可以知道)

3. public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e)
afterCompletion 方法用的比较少,一般在请求处理完了之后做一些关闭数据库连接池、关闭文件流之类的操作。


总地来说,请求的顺序大致如下:前端请求 --> preHandle --> controller接收请求 --> postHandle --> afterCompletion

多个拦截器请求顺序:  

这里写图片描述

应用

由于拦截器的特性只能拦截请求,可以用来处理请求权限问题,处理用户登录(好像也是权限问题)等场景,即用户没有权限的请求不允许访问,或者在用户登陆后将用户信息转发到主页首页等场景

使用方法

在创建拦截器之前,首先我们需要有一个可正常运行的请求环境,具体环境搭建就不多介绍了(练习代码我还在整理)。

1、在项目中创建拦截器对应类,实现HandlerInterceptor接口

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.println("this is preHandle method");
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("this is postHandle method");
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("this is afterCompletion method\n\n");
    }
}

2、在spring中添加拦截器的配置

<mvc:interceptors>
    <mvc:interceptor>
        <!--这里的path可以通过正则表达式来筛选请求对应的url,我们这里暂时只添加这一个请求-->
        <mvc:mapping path="/login1"/>
        <bean class="com.controller.LoginInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

3、修改preHandle方法返回值

修改preHandle方法返回值来确定该请求是否继续往后台发送,如果继续则会进入请求对应的controller,在controller处理完请求后,会依次执行postHandle 和afterCompletion方法;

4、测试rest

我自己对请求做了rest风格的测试,发现方法只走到了controller便没有继续往postHandle进行,不知道是什么原因,(猜测是由于rest方式的请求只返回数据,不通过modelAndView所以spring做了相应的处理,所以没有继续往下走)具体原因还在研究中。另一方面,现在工作中很多项目均使用RESTful风格请求数据,所以暂时不会深入研究这里关于modelAndView相关的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值