SpringMVC拦截器

作者:gqk


SpringMVC拦截器的使用:

SpringMVC 中的 Interceptor 拦截器的主要作用就是拦截用户的 url 请求,并在执行 handler 方法的前中后加入某些特殊请求,类似于 servlet 里面的过滤器.

 

 

 定义一个类,实现HandlerInterceptor接口,并实现该接口的preHandle()、postHandle()、afterCompletion()三个方法

package com.gqk.interceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class HandlerInterceptor implements org.springframework.web.servlet.HandlerInterceptor {
    /**
     * 执行控制器之前执行
     * 可以用作身份认证和授权
     *return false 表示拦截不会放行
     * return true 表示拦截放行
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("12332131232131231");
        //判断session
        HttpSession session  = request.getSession();
        //从session中取出用户身份信息
        String username = (String) session.getAttribute("username");

        if(username != null){
            //身份存在,放行
            return true;
        }
            request.getRequestDispatcher("login.jsp").forward(request, response);
        return false;
    }
    //执行控制器之后但是没有返回modelAndView
    //可以在此统一指定视图
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("LoginInterceptor...postHandle");
    }
    //彻底执行完控制器 可以统一异常处理,统一日志处理
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("LoginInterceptor...afterCompletion");
    }
}

在SpringMVC核心配置文件中注册自定义拦截器;

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/user/test1.action"></mvc:exclude-mapping>
            <bean class="com.gqk.interceptor.HandlerInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

 

控制器编写:

@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/test1")
    public ModelAndView test1(@RequestParam("name") String name,

                        @RequestParam("pwd") String pwd,

                        @RequestParam(defaultValue = "110") int age, HttpSession session) {
        System.out.print("name====" + name);
        System.out.print("pwd====" + pwd);
        System.out.print("age====" + age);
        if ("admin".equals(name)&&"admin".equals(pwd)){
            session.setAttribute("username",name);
        }
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("index");
        modelAndView.addObject("username",name);
        return modelAndView;

    }

 

如果没有登录 除登录外,访问其它页面 就可以进入拦截器进行拦截

拦截器与过滤器的区别:

说到这里,可能大家脑海中有了一个疑问,这不是我们之前学的过滤器吗?是的它和过滤器是有几分相似,但是也有区别,接下来我们就来说说他们的区别:

1)、过滤器是 servlet 规范中的一部分, 任何 java web 工程都可以使用。

       拦截器是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。

2)、过滤器在 url-pattern 中配置了/*之后,可以对所有要访问的资源拦截。

       拦截器它是只会拦截访问的控制器方法,如果访问的是 jsp, html,css,image 或者 js 是不会进行拦截的。

posted @ 2020-01-16 11:28  少侠gqk  阅读(168)  评论(0编辑  收藏  举报