SpringMVC拦截器

一 、拦截器

一、概述

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

二、同Filter的对比

1、过滤器(Filter)

  • 过滤器依赖于servlet容器,在实现上基于函数回调,是JavaWeb的一个组件,用来过滤请求和响应。
  • 可以对几乎所有请求进行过滤,但是缺点是在action的生命周期中,一个过滤器实例只能在容器初始化时调用一次。
  • 过滤器配置了 /*,可以拦截任何资源。

2、拦截器

  • 拦截器依赖于SpringMVC框架,是基于java的反射机制的,属于面向切面编程(AOP)思路的具体运用。
  • 可以获取IOC容器中的各个bean,在拦截器里注入一个service,可以调用业务逻辑。
  • 拦截器只会拦截访问的控制器方法, 如果访问的是html、css、image、jsp、js是不会拦截的。

三、使用场景

  • 日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。

  • 权限验证:如登录检测,进入处理器检测是否登录,如果没有直接返回到登录页面;

  • 性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录);

  • 通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个Controller中的处理方法都需要的,我们就可以使用拦截器实现。

  • OpenSessionInView:如Hibernate,在进入处理器打开Session,在完成后关闭Session。

四、如何实现拦截器呢?

1、实现拦截器接口:HandlerInterceptor

package com.interceptor;

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

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class DemoInterceptor implements HandlerInterceptor{

	  // 调用Handler之前
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// true: 按正常流程执行Handler
		// false: 不会执行handler
		System.out.println("preHandler----处理前");
		return HandlerInterceptor.super.preHandle(request, response, handler);
	}

    // Handler执行完后
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("postHandler----处理后");
		HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
	}

    //在dispatcherServlet处理后执行,进行一些资源清理。
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("afterCompletion----资源清理");
		HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
	}

}

2、在 springmvc.xml 配置文件中配置拦截器:

 <!--关于拦截器的配置--> 
<mvc:interceptors> 
   <mvc:interceptor> 
        <!-- 拦截所有请求-->
        <mvc:mapping path="/**" />
        <!--bean配置的就是拦截器-->
        <bean class="com.interceptor.DemoInterceptor"></bean>
   </mvc:interceptor> 
</mvc:interceptors>

3、编写一个controller

package com.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/inte")
public class DemoController4 {
	@GetMapping("/test1")
    public String test1() {
		System.out.println("test1.......执行了");
    	return "demo";
    }
}

打开浏览器访问 http://localhost:8080/SpringMVC2/inte/test1

运行后结果

五、使用拦截器进行登录检测

拦截用户的请求,判断用户是否登陆成功,登陆成功则放行,否则就跳转到登陆页面。

1、编写登录页面jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<base href="<%=request.getContextPath() %>/"/>
<title>Insert title here</title>
</head>
<body>
   <form action="user/login" method="post">
      UserName:<input type="text" name="userName"/><br/>
      Password:<input type="password" name="password"/><br/>
      <input type="submit" value="登录"/>
   </form>
</body>
</html>

2、 编写一个Controller

@Controller
@RequestMapping("/user")
public class UserController {
		
	@GetMapping("/login")
	public String loginPage() {
		return "user/login";
	}
	
	@PostMapping("/login")
	public String login(String userName,String password,HttpSession session) {
		if(userName != null && password != null) {
			session.setAttribute("Lotus", userName);
		}
		return "user/welcome";
	  }
   @GetMapping("/test")
	public String test() {
		return "test";
	   }
	}

3、 编写一个登陆成功的页面 welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>welcome</title>
</head>
<body>
   Hello, ${Lotus}
</body>
</html>

4、 编写用户登录拦截器

package com.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;

public class LoginInterceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)  throws Exception {
			 // 判断是否有登录(输入有账号密码,userName就会存储到session)
		     Object value = request.getSession().getAttribute("Lotus");
			  if (value != null) {
		            return true;
		        }else {
		        request.getRequestDispatcher("/WEB-INF/views/user/login.jsp").forward(request, response);
		        	 return false;
		        }
	    }
}

5、在Springmvc的配置文件中注册拦截器

 <!-- 配置拦截器 -->
     <mvc:interceptors>  
     
        <mvc:interceptor>   
        <!--拦截user下面所有的请求-->
         <mvc:mapping path="/user/**"/>
         <!--放行user路径下的login-->
         <mvc:exclude-mapping path="/user/login"/>
         <!--bean配置的就是拦截器-->
         <bean class="com.interceptor.LoginInterceptor"></bean>
      </mvc:interceptor>
     
     </mvc:interceptors>
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值