1 .拦截器(Interceptor):

用于在某个方法被访问之前进行拦截,然后在Handler执行之前或之后加入某些操作,其实就是AOP的一种实现策略。 拦截用户的请求并进行相应的处理,比如:判断用户是否登陆,判断用户权限,是否在可购买时间内,记录日志信息等。。

创建拦截器:实现HandlerInterceptor

@Component
public class TestInterceptor implements HandlerInterceptor { //请求在进入Handler之前,该方法会被调用
//如果返回true,则表示该请求会继续往下执行,也就是才会执行到Handler
//如果返回false,就不会执行到Handler,并且另外两个方法也不会执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//因为我们使用的是注解形式的处理器(RequestMapping)
//所以handler对象的真正的类型是HandlerMethod
HandlerMethod hm = (HandlerMethod) handler;
//获取该方法的注解对象
// hm.getMethodAnnotation();
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
if (user != null){ return true; //放行
}
response.sendRedirect("/log"); //重定向
return false;
} /*
Handler中的方法执行完毕之后,向客户端返回视图之前执行.
方法参数中的ModelAndView对象就是给客户端渲染所用的对象. */
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { }
/*
这个请求已经给客户端完成了渲染的工作之后,该方法会执行
这个方法中一般会做资源的清理工作.
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }
}

创建好一个拦截器,需要在spring配置文件中配置拦截器属性:

   <mvc:interceptors>
<mvc:interceptor>
<!--/**表示所有请求地址都要经过拦截器-->
<mvc:mapping path="/**"/>
<!--下面表示这些地址可以不走拦截器-->
<mvc:exclude-mapping path="/log"/>
<mvc:exclude-mapping path="/login"/>
<mvc:exclude-mapping path="/relog"/>
<mvc:exclude-mapping path="/home"/>
<!--在拦截器类上加了注解@Component,所以可以直接引入拦截器id,表明上面被拦截的地址需要经过哪个拦截器-->
<ref bean="testInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>

自定义注解,配合拦截器完成一些功能:

2. 自定义注解:

新建一个类,将class属性改为@interface ,这个类就变成一个自定义注解了

/*
注解上面需要配置这个注解可以用到哪里:
例如:是给类用的,还是给属性用的,还是给方法用的
*/
@Target(ElementType.METHOD)
//这个注解是在运行时候生效的
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckPermission {
String value();
}

在需要获取请求参数的处理器头部添加该自定义注解,

@Controller
public class UserController { @CheckPermission("one")
@RequestMapping("/one")
public String one(){ return "one";
} @CheckPermission("two")
@RequestMapping("/two")
public String two(){ return "two";
} @CheckPermission("three")
@RequestMapping("/three")
public String three(){ return "three";
} @CheckPermission("four")
@RequestMapping("/four")
public String four(){ return "four";
}
}

通过获取这个注解的参数,配合拦截器可以做一个权限的功能;

package com.lanou.demo.interceptor;

import com.lanou.demo.annotation.CheckPermission;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List; @Component
public class TestInterceptor implements HandlerInterceptor { @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession();
List<String> list = (List<String>) session.getAttribute("arr");
//获取Handler信息
HandlerMethod mv = (HandlerMethod) handler;
//判断这个请求方法是否有这个注解
if (mv.hasMethodAnnotation(CheckPermission.class)) {
//通过这个注解获取到请求地址
CheckPermission annotation = mv.getMethodAnnotation(CheckPermission.class);
String value = annotation.value(); if (list != null){
//判断这个地址是否有权限
if (list.contains(value)) {
//有权限,放行
return true;
}
}
}
//没有权限,重定向到某个页面
response.sendRedirect("/log");
return false;
} @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }
}

最新文章

  1. powershell通过wps excel导出csv
  2. CSS 相邻兄弟选择器
  3. ASCII十进制字符集
  4. mysql字段不能为空的字段为空时也能插入的方法
  5. 【Gym 100971A】Treasure Island
  6. gprof使用介绍
  7. 71. Simplify Path
  8. 图片组件——axure线框图部件库介绍
  9. [Windows Phone学习笔记]页面之间传递对象
  10. String和intern()浅析
  11. 运用jQuery写的验证表单
  12. ELK学习总结(4-1)elasticsearch更改mapping(不停服务重建索引)
  13. 将 Net 项目升级 Core项目经验:(三)迁移后的Net Standard版本的类库测试和多平台项目实测
  14. windows下复制文件报错“文件名对目标文件夹可能过长 。您可以缩短文件名并重试,或者......”
  15. roof
  16. shell脚本常用技巧
  17. 2018.10.19 NOIP训练 游戏问题(分组背包)
  18. DRBD+Heartbeat实现自动切换
  19. 2016-2017-2 20155117实验二《Java面向对象程序设计》实验报告
  20. UIView常用属性与方法/UIKit继承结构

热门文章

  1. Spring源码由浅入深系列六 CreateBean过程
  2. GPIO_F427
  3. java时间工具类,时间相互转换
  4. AtCoder ABC 128F Frog Jump
  5. 2019 ICPC 南昌网络赛
  6. shell 一些命令(转)
  7. Dribbble 流行的配色风格是什么?
  8. C#中,用户控件UserControl里面用Panl加载UserControl,并实现利用委托互相传值
  9. protobuf文档翻译-安装,数据格式及编码规范
  10. vue中获取节点.