拦截器 统一日志管理
Spring MVC 拦截器
1. 作用
在我们的业务开发中,有很多场景会使用到拦截器,比如登录认证、身份授权、统一异常处理、统一日
志处理。
2. SpringMVC 拦截器简介
1)SpringMVC 拦截器(Interceptor)实现对每一个请求处理前后进行相关的业务处理,类似与 servlet
中的 Filter。
2)SpringMVC 中的 Interceptor 拦截请求是通过 HandlerInterceptor 来实现的。
3)在 SpringMVC 中定义一个 Interceptor 非常简单,主要有4种方式:
实现 Spring 的 HandlerInterceptor 接口;(本章节案例使用此方式)
继承实现了 HandlerInterceptor 接口的类,比如 Spring 已经提供的实现了HandlerInterceptor
接口的抽象类 HandlerInterceptorAdapter;
实现 Spring 的 WebRequestInterceptor 接口;
继承实现 WebRequestInterceptor 的类;
3. 拦截器示例
3.1 定义拦截器
实现 HandlerIntercepter 接口方式,创建 LoginInterceptor 类,实现 HandlerInterceptor 接口并重
写里面的三个方法。
1 public class LoginInterceptor implements HandlerInterceptor { 2 //Handler执行前调用 3 //应用场景:登录认证、身份授权 4 //返回值为true则是放行,为false是不放行 5 @Override 6 public boolean preHandle(HttpServletRequest request, HttpServletResponse 7 response, Object handler) throws Exception { 8 return false; 9 } 10 //进入Handler开始执行,并且在返回ModelAndView之前调用 11 //应用场景:对ModelAndView对象操作,可以把公共模型数据传到前台,可以统一指定视图 12 @Override 13 public void postHandle(HttpServletRequest request, HttpServletResponse 14 response, Object handler, ModelAndView modelAndView) throws Exception { 15 } 16 //执行完Handler之后调用 17 //应用场景:统一异常处理、统一日志处理 18 @Override 19 public void afterCompletion(HttpServletRequest request, HttpServletResponse 20 response, Object handler, Exception ex) throws Exception { 21 } 22 }
3.2 配置拦截器
SpringMVC 拦截器是绑定在 HandlerMapping 中的,即如果某个 HandlerMapping 中配置拦截,则该
HandlerMapping 映射成功的 Handler 会使用该拦截器。
1)针对单个 HandlerMapping 配置
只有通过该处理器映射器查找到的处理器,才能使用该拦截器。如果现在有两个处理器映射器:其中一
个设置了处理器拦截器,另外一个没有设置,如果通过第二个映射器查找到的处理器,是无法使用拦截
器的。
1 <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> 2 <property name="interceptors"> 3 <list> 4 <ref bean="interceptor" /> 5 </list> 6 </property> 7 </bean> 8 <bean id="interceptor" class="xxx.xxx.xxx.interceptor.MyHandlerInterceptor" />
2)全局拦截器配置
SpringMVC 的全局拦截器配置,其实是把配置的拦截器注入到每个已初始化的HandlerMapping 中。
1 <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> 2 <property name="interceptors"> 3 <list> 4 <ref bean="interceptor" /> 5 </list> 6 </property> 7 </bean> 8 <bean id="interceptor" class="xxx.xxx.xxx.interceptor.MyHandlerInterceptor" />
这里需要注意的是:如果有多个拦截器,那么配置在 springmvc.xml 中最上面的拦截器,拦截器优先级
最高。
4. 拦截器实现登录认证
1 <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> 2 <property name="interceptors"> 3 <list> 4 <ref bean="interceptor" /> 5 </list> 6 </property> 7 </bean> 8 <bean id="interceptor" class="xxx.xxx.xxx.interceptor.MyHandlerInterceptor" />
1 // 拦截器 2 package cn.edu.springmvc.login; 3 import javax.servlet.http.HttpServletRequest; 4 import javax.servlet.http.HttpServletResponse; 5 import org.springframework.web.servlet.HandlerInterceptor; 6 import org.springframework.web.servlet.ModelAndView; 7 public class LoginInterceptor implements HandlerInterceptor { 8 @Override 9 public boolean preHandle(HttpServletRequest request, HttpServletResponse 10 response, Object handler) 11 throws Exception { 12 // 获取请求的URI 13 String requestURI = request.getRequestURI(); 14 System.out.println(requestURI); 15 // 1.如果请求的URL是公开地址(无需登录就可以访问的URL),采取放行。 16 if (requestURI.indexOf("login/check") > -1) { 17 return true; 18 } 19 // 2.如果用户session存在,则放行。 20 Object username = request.getSession().getAttribute("username"); 21 if (username != null && !username.equals("")) { 22 return true; 23 } 24 // 3.如果用户session中不存在,则跳转到登录页面。 25 response.sendRedirect("/index.jsp"); 26 return false; 27 } 28 @Override 29 public void postHandle(HttpServletRequest request, HttpServletResponse 30 response, Object handler, ModelAndView modelAndView) throws Exception { 31 } 32 @Override 33 public void afterCompletion(HttpServletRequest request, 34 HttpServletResponse response, Object handler, Exception ex) throws Exception { 35 } 36 } 37 //用户登录检测 38 @RequestMapping("/check") 39 public String hello(HttpSession session, User user, Model model){ 40 // 视图模型对象初始化 41 ModelAndView modelAndView = new ModelAndView(); 42 User user_test= (User)usermapper.selectOne(user.getName()); 43 if(user_test==null) 44 { 45 model.addAttribute("msg", "无此用户名!!"); 46 return "error";
} if(user_test.getPassword().equals(user.getPassword())) { modelAndView.addObject(user); session.setAttribute("username", user_test.getName()); return "hello"; } else { model.addAttribute("msg", "登录密码或用户名错误!!"); return "error"; } } // 退出 @RequestMapping("/logout") public String logout(HttpSession session) { //清空session session.invalidate(); // 重定向到登录页面 return "redirect:/"; }
本文来自博客园,作者:坤k,转载请注明原文链接:https://www.cnblogs.com/fukunwang/p/15706935.html

浙公网安备 33010602011771号