Spring MVC实现的登录拦截器代码分享

 更新时间:2017年10月19日 09:03:19   作者:黄小鱼ZZZ  
这篇文章主要介绍了Spring MVC实现的登录拦截器代码分享,涉及拦截器的简单介绍,拦截器和过滤器的区以及拦截器实现代码等相关内容,这里分享给大家,供需要的朋友参考。

之前接触过struts拦截器,但是没有使用过Spring MVC拦截器,今天花了一天时间好好研究了一下。

本文首先介绍了拦截器的基本概念,然后向大家阐述拦截器与过滤器的简要区别,通过HandlerInterceptor 接口中定义的三个方法实现拦截器功能,最后介绍了配置相关的代码,接下来看看具体内容。

定义拦截器

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

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

拦截器和过滤器的区别

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

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

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

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

实现HandlerInterceptor接口

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

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

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

    (3 )afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex) 方法,该方法也是需要当前对应的Interceptor 的preHandle 方法的返回值为true 时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。

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

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

拦截器如下:

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.apache.log4j.Logger; 
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 
import com.elushunfeng.model.ManagerUser; 
public class ManagerUserInterceptor extends HandlerInterceptorAdapter{ 
   private static Logger logger = Logger.getLogger(ManagerUserInterceptor.class); 
 
  @Override 
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 
      throws Exception { 
    /* 
     * 从session中获取用户信息 
     */ 
    ManagerUser managerUser = (ManagerUser) request.getSession().getAttribute("managerUser"); 
    if(managerUser == null){//如果session中没有用户的信息,跳转到登录页面,内部网页不能访问 
      logger.info("ManagerUserInterceptor---->>>>>>preHandle"); 
      request.getRequestDispatcher("/index.jsp").forward(request, response); 
      return false; 
    }else 
      return true;   
  } 
    
} 

拦截器完成以后,需要在配置文件中进行配置,

配置如下,

<mvc:interceptors> 
    <!-- 配置访问拦截器 --> 
    <mvc:interceptor> 
      <mvc:mapping path="/"/><!-- 我这里边是对方法分开进行拦截的 --> 
      <mvc:mapping path="/payAliPay/**" /> 
      <mvc:mapping path="/logistics/**" /> 
      <mvc:mapping path="/petroleumOrder/**" /> 
      <mvc:mapping path="/petroleum/**" /> 
      <mvc:mapping path="/carousel/**" /> 
      <mvc:mapping path="/managerUser/**" /> 
      <mvc:mapping path="/user/queryCheckUsers/**" /> 
      <bean id="managerUserInterceptor" class="com.elushunfeng.manager.interceptor.ManagerUserInterceptor"/> 
    </mvc:interceptor> 
  </mvc:interceptors> 

总结

以上就是本文关于Spring MVC实现的登录拦截器代码分享的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:SpringMVC使用MultipartFile 实现异步上传方法介绍SpringMVC在启动完成后执行方法源码解析等。如有不足之处,欢迎留言指出。小编会及时回复大家并进行修改。感谢朋友们对脚本之家的支持!

相关文章

  • SpringBoot2.0整合WebSocket代码实例

    SpringBoot2.0整合WebSocket代码实例

    这篇文章主要介绍了SpringBoot2.0整合WebSocket代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 浅谈hashmap为什么查询时间复杂度为O(1)

    浅谈hashmap为什么查询时间复杂度为O(1)

    这篇文章主要介绍了hashmap为什么查询时间复杂度为O(1),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • spring MVC中接口参数解析的过程详解

    spring MVC中接口参数解析的过程详解

    这篇文章主要给大家介绍了关于spring MVC中接口参数解析的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用spring mvc具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • 举例解析Java多线程编程中需要注意的一些关键点

    举例解析Java多线程编程中需要注意的一些关键点

    这篇文章主要介绍了Java多线程编程中需要注意的一些关键点,包括ThreadLocal变量与原子更新等一些深层次的内容,需要的朋友可以参考下
    2015-11-11
  • java基础篇之Date类型最常用的时间计算(相当全面)

    java基础篇之Date类型最常用的时间计算(相当全面)

    这篇文章主要给大家介绍了关于java基础篇之Date类型最常用的时间计算的相关资料,Java中的Date类是用来表示日期和时间的类,它提供了一些常用的方法来处理日期和时间的操作,需要的朋友可以参考下
    2023-12-12
  • java 集合之实现类ArrayList和LinkedList的方法

    java 集合之实现类ArrayList和LinkedList的方法

    下面小编就为大家带来一篇java 集合之实现类ArrayList和LinkedList的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Java中Runnable和Callable分别什么时候使用

    Java中Runnable和Callable分别什么时候使用

    提到 Java 就不得不说多线程了,就算你不想说,面试官也得让你说呀,那说到线程,就不得不说Runnable和Callable这两个家伙了,二者在什么时候使用呢,下面就来和简单讲讲
    2023-08-08
  • java编程实现屏幕截图(截屏)代码总结

    java编程实现屏幕截图(截屏)代码总结

    这篇文章主要介绍了java编程实现屏幕截图(截屏)代码,结合3个实例总结分析了Java截屏时页面抓取及图片保存的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • 关于Java8新特性Optional类的详细解读

    关于Java8新特性Optional类的详细解读

    Optional类是一个容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在,原来用 null 表示一个值不存在,现在Optional 可以更好的表达这个概念。并且可以避免空指针异常,需要的朋友可以参考下
    2023-05-05
  • springboot利用aop实现接口异步(进度条)的全过程

    springboot利用aop实现接口异步(进度条)的全过程

    我们在开发中,调用第三方接口时,往往是提交数据,要异步去获取数据,下面这篇文章主要给大家介绍了关于springboot利用aop实现接口异步(进度条)的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01

最新评论