SpringMVC拦截器Interceptor

概述:今天来简单复习一下拦截器,这个拦截器和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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值