SSM中的拦截器


SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。

过滤器与拦截器的区别:拦截器是AOP思想的具体应用。

过滤器

  • servlet规范中的一部分,任何java web工程都可以使用

  • 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截

拦截器

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

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

自定义拦截器

实现 HandlerInterceptor 接口。

  1. 新建一个Moudule

  2. 配置web.xml与 springmvc-servlet.xml文件

  3. 编写一个拦截器

public class MyInterceptor implements HandlerInterceptor {

    //在请求处理的方法之前执行
    //如果返回true执行下一个拦截器
    //如果返回false就不执行下一个拦截器
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("处理前===============");
        return true;
    }

    //在请求处理方法执行之后执行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    //在dispatcherServlet处理后执行,做清理工作
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

4、spring中配置拦截器


<mvc:interceptors>
    <mvc:interceptor>




        <mvc:mapping path="/**"/>

        <bean class="com.guo.config.MyInterceptor"/>
    mvc:interceptor>
mvc:interceptors>

5、请求

@RestController
public class TestController {

    @RequestMapping("/t1")
    public String test(){
        System.out.println("执行了test()");
        return "success";
    }
}

实战

1、自定义拦截器,继承HandlerInterceptor

package com.guo.HandlerInterceptor;

import com.guo.pojo.User;
import org.springframework.web.servlet.HandlerAdapter;
import org.springframework.web.servlet.HandlerInterceptor;

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

public class handlerInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    //通过session,拿到用户登录信息
        HttpSession session =request.getSession();
        User userSession =(User) session.getAttribute("USER_SESSION");
    //获取角色属性 Integer userRole
= userSession.getUserRole();
    //截取请求片段 String requestURI
= request.getRequestURI(); if(userSession != null){ if(userRole==2){
        //对比截取的请求片段中,是否存在"/provider"
if(requestURI.contains("/provider") || requestURI.contains("/bill")){ return true; }else { request.getRequestDispatcher("/jsp/error.jsp").forward(request,response); return false; } }else if(userRole==3){ if(requestURI.contains("/bill")){ return true; }else { request.getRequestDispatcher("/jsp/error.jsp").forward(request,response); return false; } }else{ return true; } }else { response.sendRedirect(request.getContextPath()+"/log/error"); return false; } } }

2、配置spring  xml文件


    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/user/**"/>
            <mvc:mapping path="/provider/**"/>
            <mvc:mapping path="/bill/**"/>

            <bean class="com.guo.HandlerInterceptor.handlerInterceptor"/>
        mvc:interceptor>
    mvc:interceptors>

3、controller层

@Controller
@RequestMapping("/user")
public class UserController {}

@Controller
@RequestMapping("/provider")
public class ProviderController {}

@Controller
@RequestMapping("/bill")
public class BillController {}

相关