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>

 

posted @   烁妈妈  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示