拦截器 统一日志管理

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:/";
}

 



 

posted @ 2021-12-19 11:38  坤k  阅读(180)  评论(0)    收藏  举报