SpringMVC-08-拦截器

SpringMVC-08-拦截器

1. 简介

  • SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter
    • 用于对处理器进行预处理和后处理
  • 过滤器与拦截器的区别:拦截器是AOP思想的具体应用

过滤器

  • servlet规范中的一部分,任何java web工程都可以使用
  • url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截

拦截器

  • 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
  • 拦截器只会拦截访问控制器方法,如果访问的是jsp/html/css/image/js是不会进行拦截的
    • 拦截器对静态资源是不会进行拦截的

注意:

  • 最大的区别:

    • 拦截器只会拦截访问控制器方法(Controller 中的请求)
    • 如果访问的是jsp/html/css/image/js是不会进行拦截的(只拦截controller层的
  • 使用上的区别:

    • 拦截器:实现HandlerInterceptor接口 ,但不必重写里面的方法
    • 过滤器:必须重写三个方法
      • init
      • destroy
      • doFilter

2. 自定义 拦截器

  • 想要自定义拦截器,必须实现HandlerInterceptor接口
  1. 新建一个module

  2. 配置web.xml

  3. 新建一个config包,在下面新建myinterceptor.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 1. 首先需要实现HandlerInterceptor就是一个拦截器()
public class myIntercepter implements HandlerInterceptor {

// 2. aop的三个方法实现,只有prehanle有返回值
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("============处理前============");
return true;
//return true 执行下一个拦截器,放行
//return false 不放行
}

// 2. 处理后
// 后面两个重载可以写拦截日志
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("============处理后============");
}

// 3. 完成后
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("============清理============");
}
}
  1. 拦截器配置 (在appliCation.xml中配置)

/* : 代表当前文件夹下的某一个东西

/**: 代表当前文件夹下的所有东西

/admin/** : admin下的所有请求

1
2
3
4
5
6
7
8
<!--拦截器配置-->
<mvc:interceptors>
<mvc:interceptor>
<!--/**包括这个请求下的所有的请求-->
<mvc:mapping path="/**"/>
<bean class="com.zhuuu.config.myIntercepter"/>
</mvc:interceptor>
</mvc:interceptors>
  1. Controller测试
1
2
3
4
5
6
7
8
@RestController
public class TestController {
@GetMapping("/t1")
public String test(){
System.out.println("test执行了");
return "OK";
}
}

3. 拦截器 实现登录验证

  1. 编写登录页面(login.jsp)
    • web-inf下面的所有页面或者资源,只能通过controller,或者servlet进行访问
1
2
3
4
5
6
7
8
9
10
11
12
  <body>

<%--在web-inf下面的所有页面或者资源,只能通过controller,或者servlet进行访问--%>
<h1>登录页面</h1>

<form action="${pageContext.request.contextPath}/user/login" method="post">
用户名: <input type="text" name="username">
密码: <input type="text" name="password">
<input type="submit" value="提交">
</form>

</body>
  1. 登录拦截器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class loginInteceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession(); //获取到session
// 放行的判断
// 1. 登录页面也要 放行(第一次登陆也要放行)
if (request.getRequestURI().contains("goLogin")){
return true;
}

// 2. session不为空 放行(说明以前登陆过)
if (session.getAttribute("userloginInfo")!=null){
return true;
}

// 3. 不放行之前先转发到登陆页面
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
return false;
}
}
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信