Spring MVC拦截器
拦截器是Aop思想的具体应用。
拦截器和servlet的过滤器差不多是一个意思。
拦截器
- 拦截器是SpringMVC自带的一个方法,只可以在SpringMVC框架的工程中使用。不同的框架很多都带有各自的拦截器,叫法不同而已。
- 拦截器只会拦截访问的控制器方法,静态资源不影响。
拦截器实现
想要实现拦截器,就需要使用HandlerInterceptor接口,自己写一个类继承一下HandlerInterceptor接口。
拦截器不会强制你重写它的方法,你需要重写它的方法去配置你需要拦截的controller。
//return true 执行下一个拦截器,放行 ---会存在多个拦截器
//return flase 拦截请求
@Override //处理前
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return false;//拒绝放行 拦截controller请求
}
@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 {
}
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return false;
}
//主要是重写这个方法,另外两个方法可以当成输出日志测试一下输出结果,可重写可不重写
使用拦截器前需要在SpringMVC.xml配置一下拦截器
<!--配置拦截器-->
<mvc:interceptors>
<!-- 拦截器可以配置多个-->
<mvc:interceptor>
<!--拦截的是Controller-->
<mvc:mapping path="/**"/> <!--/** 代表拦截所有请求--可以根据自己的需要配置-->
<bean class="com.ydwj.utils.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
在controller中通过HttpSession向拦截器传送数据
@PostMapping("/login")
@ResponseBody
public ResponseMessage login(@RequestParam String username,
@RequestParam String password,
HttpSession session) {
System.out.println("username:"+username+" " +"password:"+password);
boolean result =adminService.getAdminByUsernameAndPassWord(username,password);
session.setAttribute("isLogin",result);//传送的判断信息 为true即账号密码存在
return result ? responseMessage.success():responseMessage.error();
}
//ResponseMessage 自定义的用来返回状态码的类 用String即可
//MyInterceptor的实现
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("=======处理前======");
// 取到session传过来信息
HttpSession session = request.getSession();
//登录页放行,注意getRequestURI()和getRequestURL()
if (request.getRequestURI().contains("login"))
{
return true;
}
//判断是否为true
if (session.getAttribute("isLogin") != null)
{
System.out.println("账号密码正确");
return true;
}else
{
//登录错误 跳转回登录页
System.out.println("登录错误 跳转登录页");
request.getRequestDispatcher("toLogin").forward(request,response);
return false;
}
}
注:随着学习的深入,会不定期的进行修改更新。