Spring MVC如何实现的登录拦截器

  介绍

小编给大家分享一下Spring MVC如何实现的登录拦截器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

<强>定义拦截器

,,,,,,SpringMVC中的拦截拦截请求是通过HandlerInterceptor来实现的。在SpringMVC中定义一个拦截器非常简单,主要有两种方式,第一种方式是要定义的拦截器类要实现了春天的HandlerInterceptor接口,或者是这个类继承实现了HandlerInterceptor接口的类,比如春天已经提供的实现了HandlerInterceptor接口的抽象类HandlerInterceptorAdapter;第二种方式是实现春天的WebRequestInterceptor接口,或者是继承实现了WebRequestInterceptor的类。

,,,,,,拦截器的使用场景:解决乱码问题,解决权限验证问题使用原则:处理所有请求的共同遇到的问题

<强>拦截器和过滤器的区别

,,,,,,过滤器过滤依赖于Servlet容器,基于回调函数,过滤范围大

,,,,,,拦截器拦截依赖于框架容器,基于反射机制,只过滤请求

,拦截器可以处理网络应用中请求的一些通用性问题

,共性问题在拦截器中处理,可以减少重复代码,便于维护

<>强实现HandlerInterceptor接口

,,,,,,HandlerInterceptor接口中定义了三个方法,我们就是通过这三个方法来对用户的请求进行拦截处理的。

,,,,(1)preHandle (HttpServletRequest请求、HttpServletResponse响应对象句柄)方法,顾名思义,该方法将在请求处理之前进行调用.SpringMVC中的拦截器是链式的调用的,在一个应用中或者说是在一个请求中可以同时存在多个拦截器。每个拦截器的调用会依据它的声明顺序依次执行,而且最先执行的都是拦截器中的preHandle方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值布尔类型的,当它返回为假时,表示请求结束,后续的拦截器和控制器都不会再执行;当返回值为真时就会继续调用下一个拦截器的preHandle方法,如果已经是最后一个拦截器的时候就会是调用当前请求的控制器方法。

,,,,(2)postHandle (HttpServletRequest请求、HttpServletResponse响应对象句柄,ModelAndView ModelAndView)方法,由preHandle方法的解释我们知道这个方法包括后面要说到的afterCompletion方法都只能是在当前所属的拦截器的preHandle方法的返回值为真时才能被调用.postHandle方法,顾名思义就是在当前请求进行处理之后,也就是控制方法调用之后执行,但是它会在DispatcherServlet进行视图返回渲染之前被调用,所以我们可以在这个方法中对控制器处理之后的ModelAndView对象进行操作.postHandle方法被调用的方向跟preHandle是相反的,也就是说先声明的拦截器的postHandle方法反而会后执行,这和Struts2里面的拦截器的执行过程有点类型.Struts2里面的拦截器的执行过程也是链式的,只是在Struts2里面需要手动调用ActionInvocation的调用方法来触发对下一个拦截器或者是行动的调用,然后每一个拦截器中在调用方法调用之前的内容都是按照声明顺序执行的,而调用方法之后的内容就是反向的。

,,,(3)afterCompletion (HttpServletRequest请求、HttpServletResponse响应对象处理,异常交货)方法,该方法也是需要当前对应的拦截器的preHandle方法的返回值为真时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。

,,,,我试着做了一个简单的登录拦截,根据会话中是否有信息来进行判断。以下是代码,代码很简单,控制器中判断用户名密码是否正确,然后将用户信息保存到会话中,方法如下:

/*,   ,,,*,判断用户的登录信息,,注意此方法不能拦截,否则拦截器获取不到会话中的信息,   ,,*/@RequestMapping (“/indexManagerUser/managerLogin"),   ,,,public  String  userLogin (String  HttpServletRequest 请求,HttpServletResponse 响应;用户名、String 密码){   logger.info (“STEP  INTO ——祝辞,ManagerUserController.userLogin ()“);//打印出状态,   如果(userName ==, null  | |, passWord ==, null) {//对用户名密码进行判空处理,   return “经理/错误/loginError";//返回到登录错误界面   }   ManagerUser  ManagerUser =, managerUserService.userLogin(用户名、密码);//调用服务判断用户名密码是否正确,   如果(managerUser  !=, null) {//如果用户信息不为空,将用户信息保存到会话中,   HttpSession  session =, request.getSession ();   session.setAttribute (“managerUser", managerUser);   session.setMaxInactiveInterval (1800);   return “经理/systemSet/welcome";   其他},{   return “经理/错误/loginError";   }   }

Spring MVC如何实现的登录拦截器