Spring Boot 实现登录拦截

Spring Boot 的拦截器

过往的残酷回忆,不会随着年岁而消减。
世界既不黑也不白,而是一道精致的灰。


前言

SpringMvC中有两种很普遍的AOP实现:过滤器(Filter)与 拦截器(Interceptor)


学习内容:

拦截器(Interceptor)

拦截器(Interceptor)

  1. 拦截器是面向切面编程(AOP,Aspect Oriented Program)的。
  2. 拦截器的主要包含HandlerInterceptor、WebMvcConfigurer接口。
  3. 集成HandlerInterceptor接口后会重写4大方法:preHandle是在请求controllor前调用。postHandler在调用Controller方法之后,视图渲染之前调用。afterCompletion是在渲染视图完成之后使用。afterConcurrentHandlingStarted方法用来处理异步请求。

实现步骤

  1. 主要演示登录验证拦截功能。
  2. 创建LoginInterceptor并实现HandlerInterceptor接口,重写preHandle方法。
package com.youmi.config;

import java.io.IOException;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import com.youmi.entity.IUser;

/**
 * 描述:自定义拦截器
 * 1、此类需要与SessionInterceptor 类配合使用
 * 2、SessionInterceptor类白名单中接口会自动过滤,不会在此类中执行。
 * @author LT
 *
 */
@Component
public class LoginInterceptor implements HandlerInterceptor{
	
	@Override
	
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
		System.out.println("执行到了preHandle方法");
        System.out.println(handler);
        //获取请求路径(包含Controller接口与HTML页面)
        System.out.println(request.getRequestURI());
        //获取session,此处session会根据前端cookie中存储的sessionID进行获取。
        IUser user = (IUser) request.getSession().getAttribute("IUser");
        if (user==null){
        	System.out.println(request.getContextPath());
            response.sendRedirect(request.getContextPath()+"/");//拦截后跳转的方法
            System.out.println("已成功拦截并转发跳转");
            return false;
        }
        // 获取浏览器中的cookie
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
			System.out.println(cookie.getName()+":"+cookie.getValue());
		}
        System.out.println("合格不需要拦截,放行");
        return true;
    }

}
  1. 创建SessionInterceptor 类并实现WebMvcConfigurer接口。
  2. 老版本是WebMvcConfigurerAdapter接口。
package com.youmi.config;

import java.util.ArrayList;
import java.util.List;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 描述:自定义拦截器,并注入SpringMVC
 * 1、主要用来定义需要被拦截、放行的接口,包含前端页面、js、css
 * 2、此类需要与实现HandlerInterceptor接口的类结合使用。
 * @author
 *
 */
@Configuration
public class SessionInterceptor implements WebMvcConfigurer{
	
	/**
     * 自定义拦截器,添加拦截路径和排除拦截路径
     * addPathPatterns():添加需要拦截的路径
     * excludePathPatterns():添加不需要拦截的路径
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    	// 拦截路径:必须登录才可以访问
		List<String> patterns = new ArrayList<>();
		patterns.add("/**");
		
		// 白名单:在黑名单范围内,却不需要登录就可以访问
		List<String> excludePatterns = new ArrayList<>();
		// 添加登录接口
		excludePatterns.add("/system/user/login");
		
		// 注册拦截器
		// new LoginInterceptor中LoginInterceptor就是实现HandlerInterceptor接口的类。
		registry
			.addInterceptor(new LoginInterceptor())
			.addPathPatterns(patterns)
			.excludePathPatterns(excludePatterns);
    }

}

  1. 创建UserController 类
package com.youmi.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.fastjson.JSONObject;
import com.youmi.VO.ResultVO;
import com.youmi.entity.IUser;
import com.youmi.service.UserService;

/**
 * 用户
 * @author 
 * @data 2020年5月6日
 */
@RestController
@RequestMapping("/system/user")
public class UserController extends BaseController{
	
	/**
	 * 登录
	 * @param json
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/login")
	public Object login(HttpServletRequest request,@RequestBody JSONObject json) {
		IUser user = userService.login(json);
		HttpSession session = request.getSession();
		session.setAttribute("IUser", user);
		return user;
	}

}
  1. 一个完整的登录拦截器就完成了。

图解在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值