spring MVC拦截器

spring MVC中的拦截器是非常重要的,他的主要作用是拦截用户 的请求并进行相应的处理,,例如权限验证,或者判断用户是否登录
使用拦截器有两种方式,第一种是定义Interceptor实现类,第二种是实现HandlerInterceptor
springMVC中的interceptor拦截请求是通过handlerinterceptor来实现的。在springmvc中定义 一个interceptor非常简单,主要有两种方式,第一种是定义一个interceptor类,要实现spring的HandlerInterceptor接口,或者也可以实现继承实现了handlerInterceptor接口的类,第二种方式是实现了spring的WebRequestInterceptor接口

第二种方式是实现了HandlerIntercepter接口,这个接口中定义了三个方法,我们就是通过这三个方法来控制拦截的,

package cn.mvc.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class TestInterceptor implements HandlerInterceptor {
    /**
     * 只有preHandle返回true才会被执行
     * 在视图解析器执行后执行
     * 一般用于清理工作
     */
    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("after completion");

    }
    /**
     * preHandle执行后返回true才能执行
     * 此方法在处理器执行后,数据模型被渲染前执行
     * 一般可用于处理数据模型需要注意的是preHandle先调用,那么postHandle就会被后调用
     */
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        System.out.println("post------");

    }
    /**
     * 在处理器执行前执行会返回一个boolean值,只有返回true才可以执行下一个拦截器,或处理器方法,false不继续执行
     * 一般进行初始化动作
     */
    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object arg2) throws Exception {
//      拿到请求路径进行判断
        String uri = req.getRequestURI();
        if(uri.endsWith("login")){
            System.out.println("woshi yi1111");
            return true;
        }
        if(req.getSession().getAttribute("name")!=null){
            return true;
        }

        req.getRequestDispatcher("login.jsp").forward(req, resp);

        return true;
    }

}

prehandle(HttpServletRequest request, HttpServletResponse response, Object handle)该方法是在请求处理之前进行调用的,在一个springMVC中可以存在多个interceptor,每个都会有一个prehandle
postHandle()这个方法是在prehandle方法返回true的时候执行的,postHandle在处理器执行后。在数据模型被渲染前执行
一般可以用于处理数据模型,需要注意 的是prehandle 先调用,它就会后调用

afterCompletion(),他是最后执行的,同上,它也是等到prehandler返回true的时候才会调用,一般用于清理工作

实现上面的方法还要配置文件

<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/hello.do"/>
            <bean class="cn.bjsxt.interceptor.MyInterceptor"></bean>

    </mvc:interceptors>

最后说一下多拦截器的执行顺序
A(preHandle)—> B(preHandle) –> controller –> B(postHandle) –> A(postHandle)—> View –> B(afterCompletion) –> A (afterCompletion)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC拦截器是一种应用于请求和响应过程中的过滤器,可以用于对请求进行预处理、对响应进行后处理,以及在请求到达处理程序之前或处理程序返回响应之后执行某些操作。 在Spring MVC中,拦截器是通过实现HandlerInterceptor接口来实现的。该接口定义了三个方法,分别是preHandle()、postHandle()和afterCompletion()。 - preHandle()方法在请求到达处理程序之前执行,可以用于进行身份验证、权限校验等操作,如果该方法返回false,则请求将被拦截并不会到达处理程序。 - postHandle()方法在处理程序完成请求处理后但尚未返回响应时执行,可以用于修改响应或添加一些额外的信息。 - afterCompletion()方法在请求处理完成后执行,无论成功或失败都会执行,可以用于进行资源清理等操作。 要使用拦截器,需要在Spring配置文件中进行配置,并将其注册到DispatcherServlet中。 下面是一个简单的拦截器示例,用于记录请求处理时间: ```java public class TimeInterceptor implements HandlerInterceptor { private static final Logger LOGGER = LoggerFactory.getLogger(TimeInterceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { request.setAttribute("startTime", System.currentTimeMillis()); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { long startTime = (long) request.getAttribute("startTime"); long endTime = System.currentTimeMillis(); LOGGER.info("Request URL: {} , Time: {}ms", request.getRequestURL(), endTime - startTime); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // do nothing } } ``` 在Spring配置文件中进行配置: ```xml <mvc:interceptors> <bean class="com.example.TimeInterceptor" /> </mvc:interceptors> ``` 这样,每次请求处理完成后,日志中就会打印该请求的处理时间,以便进行性能优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值