概述:今天来简单复习一下拦截器,这个拦截器和filter过滤器比较相似,所以在使用的过程中会出现一些似同点,今天我来温故而知新。
springMVC拦截器介绍
SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预先处理和后处理。
我们可以自己定义一些拦截器来实现一些特定的功能。
如果拦截器比较多,形成拦截器链条,简称拦截链,拦截链就是将拦截器按一定顺序形成一条,在被访问的时候,拦截器会一一被调用。
Interceptor拦截器和Filter过滤器区别
一、过滤器是servlet规范中的一部分,任何java Web工程都可以使用。
拦截器是SpringMVC框架自己的,只有使用springMVC框架的工程才能使用。
二、过滤器在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截。
拦截器它是智慧拦截访问的控制器方法,如果访问的是jsp,html,css,image或者js是不会进行拦截的。
三、拦截器基于SpringMVC基础上通过IOC可以后去bean
过滤器就不行。
四、拦截器不存在初始化,可以连续被调用
过滤器只能初始化一次。
原理
1、preHandle预处理拦截 return true 代表放行,return false代表拒绝。
2、controller控制器
3、postHandle在请求处理之后进行拦截, return true 代表放行,return false代表拒绝。
4、afterCompletion请求结束之后调用, return true 代表放行,return false代表拒绝。
实现拦截器的步骤
配置springMVC框架
编写一个类,实现HandlerInterceptor接口
implements HandlerInterceptor
/**
* 在请求处理之前进行调用(Controller方法调用之前)
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws ServletException, IOException {
}
/**
* 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView mv)
throws Exception {
}
/**
* 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行 (主要是用于进行资源清理工作)
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception ex)
throws Exception {
}
配置拦截器
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/> <!-- 用于指定对拦截的 url -->
<mvc:exclude-mapping path=""/><!-- 用于指定排除的 url-->
<bean id="handlerInterceptorDemo1" class="com.itheima.web.interceptor.HandlerInterceptorDemo1">
</bean>
</mvc:interceptor>
</mvc:interceptors>
拦截链
拦截链的其实就是配置了1个以上的拦截器,由拦截器组成成一条链,拦截顺序是由配置的先后顺序决定的。
拦截链的配置
<!-- 配置拦截器的作用范围 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" /><!-- 用于指定对拦截的 url --> <bean id="handlerInterceptorDemo1" class="com.itheima.web.interceptor.HandlerInterceptorDemo1">
</bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean id="handlerInterceptorDemo2" class="com.itheima.web.interceptor.HandlerInterceptorDemo2"></bean>
</mvc:interceptor>
</mvc:interceptors>
Interceptor 简单实战
1、有一个登录页面,需要写一个 controller 访问页面
2、登录页面有一提交表单的动作。需要在 controller 中处理。
判断用户名密码是否正确
如果正确 向 session 中写入用户信息
返回登录成功。
3、拦截用户请求,判断用户是否登录
如果用户已经登录。放行
如果用户未登录,跳转到登录页面
上码
//登陆页面 @RequestMapping("/login")
public String login(Model model)throws Exception{
return "login";
}
//登陆提交 //userid:用户账号,pwd:密码
@RequestMapping("/loginsubmit")
public String loginsubmit(HttpSession session,String userid,String pwd)throws Exception{
//向 session 记录用户身份信息
通过数据库查询用户userId
session.setAttribute("activeUser", userid);
return "redirect:/main.jsp";
}
//退出 @RequestMapping("/logout")
public String logout(HttpSession session)throws Exception{
//session 过期
session.invalidate();
return "redirect:index.jsp"; }
``
```java
public class LoginInterceptor implements HandlerInterceptor{
@Override Public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//如果是登录页面则放行
if(request.getRequestURI().indexOf("login.action")>=0){
return true;
}
HttpSession session = request.getSession();
//如果用户已登录也放行
if(session.getAttribute("user")!=null){
return true;
}
//用户没有登录挑战到登录页面
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
return false;
}
}
过滤拦截器拦截静态资源
拦截器中增加针对静态资源不进行过滤(涉及spring-mvc.xml)
<!-- 释放对静态资源的拦截 -->
<mvc:resources location="/" mapping="/**/*.js"/>
<mvc:resources location="/" mapping="/**/*.css"/>
<mvc:resources location="/assets/" mapping="/assets/**/*"/>
<mvc:resources location="/images/" mapping="/images/*" />
<!-- 拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 释放对静态资源的拦截 -->
<mvc:mapping path="/**/*"/>
<mvc:exclude-mapping path="/**/fonts/*"/>
<mvc:exclude-mapping path="/**/*.css"/>
<mvc:exclude-mapping path="/**/*.js"/>
<mvc:exclude-mapping path="/**/*.png"/>
<mvc:exclude-mapping path="/**/*.gif"/>
<mvc:exclude-mapping path="/**/*.jpg"/>
<mvc:exclude-mapping path="/**/*.jpeg"/>
<mvc:exclude-mapping path="/**/*login*"/>
<mvc:exclude-mapping path="/**/*Login*"/>
</mvc:interceptor>
</mvc:interceptors>