【Spring】自定义拦截器实现简单的登录拦截

  • Post author:
  • Post category:其他



简介

: HandlerInterceptor是SpringWebMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于处理器进行预处理和后处理。通过实现该接口自定义拦截器,进行登录拦截。



一、什么是拦截器:

引用: https://blog.csdn.net/echo0127/article/details/109160784


  1. 什么是拦截器

    :在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略

  2. 为什么需要拦截器

    :在做身份认证或者是进行日志的记录时,我们需要通过拦截器达到我们的目的。最常用的登录拦截、或是权限校验、或是防重复提交、或是根据业务像12306去校验购票时间,总之可以去做很多的事情

  3. 如何用拦截器

    :在spring中用拦截器需要实现HandlerInterceptor接口或者它的实现子类:HandlerInterceptorAdapter,同时在applicationContext.xml文件中配置拦截器



二、实现拦截器

  1. 实现接口:

    HandlerInterceptor
  2. 继承抽象类(HandlerInterceptor的实现类)

    :HandlerInterceptorAdapter



三、接口实现

自定义拦截器:UserLoginInterceptor 
public class UserLoginInterceptor implements HandlerInterceptor {
 	/***
     * 在请求处理之前进行调用(Controller方法调用之前)
     */
	@Override
    public boolean preHandle(HttpServletRequest request, 
    			HttpServletResponse response, Object handler) throws Exception {
    	System.out.println("执行了拦截器的preHandle方法");
    	//如果返回值为false时,被请求时,拦截器执行到此处将不会继续操作
       //如果返回值为true时,请求将会继续执行后面的操作(继续执行后续的controller)
        return false;
    }

    /***
     * 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("执行了拦截器的postHandle方法");
    }

    /***
     * 整个请求结束之后被调用,也就是在DispatchServlet渲染了对应的视图之后执行
     * (主要用于进行资源清理工作)
     */
    @Override
    public void afterCompletion(HttpServletRequest request, 
    		HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("执行了拦截器的afterCompletion方法");
    }
}



四、登录拦截实现

由于登录拦截是请求前进行操作的,这里主要还是通过覆写preHandle方法
我这里使用session保存了user的信息,通过判断user是否为空来判断是否登录
public boolean preHandle(HttpServletRequest request,
			 HttpServletResponse response, Object handler) throws Exception {
        System.out.println("执行了拦截器的preHandle方法");
        try {
            HttpSession session = request.getSession();
            //统一拦截(查询当前session是否存在user)(这里user会在每次登录成功后,写入session)
            User user = (User) session.getAttribute("user");
            if (user != null) {
                return true;
            }
            response.sendRedirect(request.getContextPath() + "login");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;

    }
后端登录处理器,我这里使用了mybatis进行数据库查询用户的用户名和密码是否输入正确
主要还是通过request.getSession().setAttribute()来保存user
	@RequestMapping("/doLogin")
    @ResponseBody
    public String doLogin(User user, Model model, HttpServletRequest request) {
        List<User> u = mapper.findByUP(user.getUsername(), user.getPassword());
        if (!u.isEmpty()) {
            model.addAttribute("user", user);
            request.getSession().setAttribute("user", user);
            return "success";
        }
        return "failed";
    }



五、实现WebMvcConfigurer接口

前面说过,HandlerInterceptor是SpringWebMVC的处理器拦截器。
我们自定义了拦截器,需要在WebMvcConfigurer进行添加。
接下来,展示下WebMvcConfigurer接口的常用方法
	 /* 拦截器配置 */
	void addInterceptors(InterceptorRegistry var1);
	/* 视图跳转控制器 */
	void addViewControllers(ViewControllerRegistry registry);
	/**
	  *静态资源处理
	**/
	void addResourceHandlers(ResourceHandlerRegistry registry);
	/* 默认静态资源处理器 */
	void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer);
	/**
	  *这里配置视图解析器
	 **/
	void configureViewResolvers(ViewResolverRegistry registry);
	/* 配置内容裁决的一些选项*/
	void configureContentNegotiation(ContentNegotiationConfigurer configurer);
	/** 解决跨域问题 **/
	public void addCorsMappings(CorsRegistry registry) ;
这里只为了添加拦截器,只需要覆写addInterceptors方法即可
首先,添加一个配置类,实现WebMvcConfigurer接口
然后,添加拦截器,配置拦截规则。
@Configuration
public class LoginConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册UserLoginInterceptor拦截器
        InterceptorRegistration registration = registry.addInterceptor(
        		new UserLoginInterceptor());
        registration.addPathPatterns("/**"); //所有路径都被拦截
        registration.excludePathPatterns(    //添加不拦截路径
                "/login",                    //登录路径
                "/**/*.html",                //html静态资源
                "/**/*.js",                  //js静态资源
                "/**/*.css"                  //css静态资源
        );
    }
}
至此,本次的小功能就到此结束了。



版权声明:本文为m0_46367119原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。