SpringMVC——拦截器Interceptor


简介

  spring的拦截器interceptor就是web的Filter

部署


<
mvc:interceptors>
    
    <mvc:interceptor>
      
        <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/user/login"/>

         <bean class="xyz.javaswing.Interceptor.PrivilegeInterceptor"/> mvc:interceptor> mvc:interceptors>

实现

  拦截的使用实现Spring提供拦截器接口:HandlerInterceptor

  重写内部的方法。

    boolean preHandle (HttpServletRequest request , HttpServletResponse response , Object handler)      

    参数

      request:拦截的请求对象

      response:拦截的响应对象

      handler:未知

    返回值:boolean

    返回值意义:能否通行。true可以通行,false不可通行

    作用:拦截在响应前做出过滤操作

  void postHandle(HttpServletRequest request,HttpServletResponse response , Object Handler,ModelAndView modelAndView)

    参数:

      request:拦截到的请求对象

      response:拦截到的响应对象

      handler:未知

      modelAndView:拦截到的视图对象

    返回值:无

    返回值意义:无

    作用:拦截请求,在视图返回前做出操作。

  void afterCompletion(HttpServletRequest request,HttpServletResponse response , Object Handler,Exception ex)

    参数:

      request:拦截到的请求对象

      response:拦截到的响应对象

      handler:未知

      ex:异常对象,未知作用

    返回值:void

    返回值意义:无

    作用:在视图返回后,作操作

使用

        
    
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            
            <mvc:exclude-mapping path="/user/login"/>
            <bean class="xyz.javaswing.Interceptor.PrivilegeInterceptor"/>
        mvc:interceptor>
    mvc:interceptors>
public class PrivilegeInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 判断用户是否登陆,session中有无user
        HttpSession session = request.getSession();
        User user =(User) session.getAttribute("user");
        if( user == null ){
            response.sendRedirect(request.getContextPath()+"/login.jsp");
            return false; // 不放行
        }

        // 有user,放行。让它访问啥就访问啥。
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }
}

拦截器的局限

  spring mvc的拦截器只拦截controller不拦截jsp文件,如果不拦截jsp文件也会给系统带安全性问题。

    解决方案有两种:

      1、将所有的jsp文件放入到WEB-INF文件夹下,这样用户是直接不能访问WEB-INF文件下的jsp文件的。spring mvc的理念也是通过controller里的@RequestMapping来请求相关jsp页面,而非用户直接访问jsp页面。

      2、还有一种解决方案:jsp如果不放在WEB-INF文件下,spring mvc是无法拦截的,这种请情况下需要用最原始的servlet的Filter接口,具体可以参照