08-SpringMVC核心之一个拦截器
程序员文章站
2022-07-09 18:10:12
...
上一篇:07-SpringMVC核心之异常处理https://blog.csdn.net/fsjwin/article/details/109618746
拦截器
1. 拦截器是springmvc中的一种组件,需要实现HandlerInterceptor接口
2. 拦截器和过滤器类似,功能方向侧重不同,过滤器用来过滤请求,设置编码字符集等工作。拦截器是拦截用户请求,做请求做判断处理的。
3. 拦截器是全局的,可以是0个,1个,多个,他们一起拦截用户请求。
4. 拦截器主要用在登录处理,权限检查,记录日志等。
拦截器的使用步骤
1. 定义类实现HandlerIntercepter接口
2. 在springmvc中配置文件中,声明拦截器,让框架知道拦截器的存在。
拦截器的执行时间点
1. 在请处理之前,也就是controller类的方法执行之前被拦截。
2. 在控制器方法执行之后也会执行拦截器
3. 在请求处理完成后也会执行拦截器
1.自定义拦截器
package com.yuhl.handler;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.security.interfaces.RSAKey;
/**
* @author yuhl
* @Date 2020/11/11 19:50
* @Classname MyIntercepter
* @Description 自定义拦截器
*/
public class MyHandlerIntercepter implements HandlerInterceptor {
/**
* 需要掌握
* 1. 方法在控制器controller执行之前执行
* 2. 在这个方法中可以获取请求信息,验证请求信息是否符合要求,如果验证失败则返回false,如果验证成功则返回true。
* 3. 这个是整个请求入口门户,超级重要就是门卫呀!!!!!!!!!!!!!!!!!!!!!!
* @param request
* @param response
* @param handler 当前的controller对象
* @return true:继续执行,false 拦截执行
* @throws Exception
*/
/* @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyHandlerIntercepter.preHandle");
request.getRequestDispatcher("/tips.jsp").forward(request, response);//返回false的时候给一个错误页面
return false; //返回false就不会执行controller控制器的执行。
}*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyHandlerIntercepter.preHandle");
return true; //返回false就不会执行controller控制器的执行。
}
/**
* 了解接口,在处理器方法执行之后执行,能的道ModelAndView,可以对他进行修改,偷梁换柱!!!!!二次修正。
* @param request
* @param response
* @param handler 对拦截的处理器对象controller对象
* @param modelAndView 返回的模型和视图返回值
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyHandlerIntercepter.postHandle");
modelAndView.addObject("msg", "偷梁换柱了");
modelAndView.setViewName("tips2");//偷梁换柱,修改了msg和最终视图tips2 (src\main\webapp\WEB-INF\view\tips2.jsp)
}
/**
* 视图处理完成后执行
* 比如执行了forwoard或者redirect,一般做资源回收工作的。
* @param request
* @param response
* @param handler
* @param ex 异常对象
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyHandlerIntercepter.afterCompletion");
}
}
2.自定义拦截器方法preHandle
当返回true的时候,才会调用controller的对应方法,当返回false的时候可以给一个错误页面,提示用户:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyHandlerIntercepter.preHandle");
request.getRequestDispatcher("/tips.jsp").forward(request, response);//返回false的时候给一个错误页面
return false; //返回false就不会执行controller控制器的执行。
}
3.自定义拦截器方法postHandle
在controller的对应方法执行完成的时候调用的,可以对modelAndvie进行偷梁换柱的修改,不进可以修改msg,而且可以修改视图:
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyHandlerIntercepter.postHandle");
modelAndView.addObject("msg", "偷梁换柱了");
modelAndView.setViewName("tips2");//偷梁换柱,修改了msg和最终视图tips2 (src\main\webapp\WEB-INF\view\tips2.jsp)
}
把msg修改为偷梁换柱了
把视图修改为/WEB-INF/view/tips2.jsp
4.自定义拦截器方法afterCompletion
forward等之后调用的方法一般做资源回收工作的
5.拦截器个方法的执行流程图下图
6.总结
由来拦截器我们可以对请求的关键节点进行手术刀式的处理,可以做到精细处理。
上一篇: SpringMVC之拦截器
下一篇: 达夫设备之js