Spring10 第十 springMVC拦截器
1. 1. SpringMVC拦截器
1.1 拦截器(interceptor)的作用
Spring MVC 的拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain)。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现。
1.2 拦截器和过滤器区别
1.3 拦截器快速入门
自定义拦截器很简单,只有如下三步:
①创建拦截器类实现HandlerInterceptor接口
②配置拦截器③测试拦截器的拦截效果
----------
①创建拦截器类实现HandlerInterceptor接口
public class MyHandlerInterceptor1 implements HandlerInterceptor {
//目标方法执行之前,执行。返回false,往后的目标方法等都不执行。返回true,往下执行。
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {System.out.println("preHandle running...");return true;}
//目标方法执行之后,视图对象返回之前执行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
System.out.println("postHandle running...");}
//所有方法都执行完毕之后,执行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {System.out.println("afterCompletion running...");}}
②配置拦截器在springmvc.xml
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--配置拦截哪些资源-->
<mvc:mapping path="/**"/>
<!--配置不拦截哪些资源-->
<mvc:exclude-mapping path="/user/login"/>
<bean class="com.itheima.interceptor.MyHandlerInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
③测试拦截器的拦截效果(编写目标方法)@RequestMapping("/quick23")
@ResponseBodypublic ModelAndViewquickMethod23() throws IOException, ParseException{
System.out.println("目标方法执行....");
ModelAndViewmodelAndView= new ModelAndView();
modelAndView.addObject("name","itcast");
modelAndView.setViewName("index");
return modelAndView;}
1.4 多拦截器操作
<!--配置拦截器-->
<mvc:interceptors>
<!--配置拦截器1-->
<mvc:interceptor>
<!--配置拦截哪些资源-->
<mvc:mapping path="/**"/>
<bean class="com.itheima.interceptor.MyHandlerInterceptor1"/>
</mvc:interceptor>
<!--配置拦截器2-->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.itheima.interceptor.MyHandlerInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
1.5 拦截器方法说明
1.6 案例-用户登录权限控制
需求:用户没有登录的情况下,不能对后台菜单进行访问操作,点击菜单跳转到登录页面,只有用户登录成功后才能进行后台功能的操作
(一)自定义拦截器
public class PrivilegeInterceptor implements HandlerInterceptor{
public Boolean preHandle(HttpSerlverRequest request,HttpServletResponse,Object handler){
//逻辑,判断用户是否登录,本质,判断session中有没有user
HttpSession session=request.getSession();
User user=(User)session.getAttribute(s:”user”);
if(user==null){
//没有登录,跳转到登录页面
response.sendRedirect(s:request.getContextPath()+”/login.jsp”);
return false;
}
return true;
}
}
(一一)登录方法
public class UserLogin{
@RequestMapping(“/login”)
public String login(String username,String password,HttpSession session){
User user=userService.getUser(username,password);
if(user!=null){
//登录成功,将user存储到session
session.setAttribute(s:”user”,user);
return “redirect:/index.jsp”;
}
return “redirect:/login.jsp”;
}
}
(二)在springmvc.xml配置拦截器
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--配置拦截哪些资源-->
<mvc:mapping path="/**"/>
<!--配置不拦截哪些资源-->
<mvc:exclude-mapping path="/user/login"/>
<bean class="com.itheima.interceptor. PrivilegeInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构