Spring Boot 使用拦截器--跟着慕课熊猫学

Spring Boot 使用拦截器

拦截器可以跟踪对应用的访问行为,对合法访问行为予以放行,对非法访问行为予以拒绝。

创建拦截器

/**
 * 自定义拦截器类
 */
public class MyInterceptor implements HandlerInterceptor {// 实现HandlerInterceptor接口
	/**
	 * 访问控制器方法前执行
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		if (request.getRequestURI().contains("/login") == true) {// 登录方法直接放行
			return true;
		} else {// 其他方法需要先检验是否存在Session
			if (request.getSession().getAttribute("LOGIN_NAME") == null) {//未登录的不允许访问
				return false;
			} else {
				return true;
			}
		}
	}

	/**
	 * 访问控制器方法后执行
	 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println(new Date() + "--postHandle:" + request.getRequestURL());
	}

	/**
	 * postHandle方法执行完成后执行,一般用于释放资源
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println(new Date() + "--afterCompletion:" + request.getRequestURL());
	}
}

MyInterceptor 中的方法执行顺序为 preHandle – Controller 方法 – postHandle – afterCompletion ,所以拦截器实际上可以对 Controller 方法执行前后进行拦截监控。

preHandle 需要返回布尔类型的值。 preHandle 返回 true 时,对控制器方法的请求才能到达控制器,继而到达 postHandle 和 afterCompletion 方法;如果 preHandle 返回 false ,后面的方法都不会执行。

配置拦截器

/**
 * Web配置类
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {
	/**
	 * 添加Web项目的拦截器
	 */
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// 对所有访问路径,都通过MyInterceptor类型的拦截器进行拦截
		registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
	}
}

测试

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

/**
 * 登录控制器
 */
@RestController
public class LoginController {
    /**
     * 登录方法
     */
    @RequestMapping("/login")
    public boolean login(HttpServletRequest request, String username, String password) {
        if ("momoli".equals(username) && "123456".equals(password)) {
            // 登录成功,则添加Session并存储登录用户名
            request.getSession().setAttribute("LOGIN_NAME", username);
            return true;
        }
        return false;
    }

    /**
     * 获取登录人员信息
     */
    @RequestMapping("/info")
    public String info(HttpServletRequest request) {
        return "您就是传说中的:" + request.getSession().getAttribute("LOGIN_NAME");
    }
}

效果:

先请求登录方法 http://127.0.0.1:8080/login?username=momoli&password=123456 ,然后访问 http://127.0.0.1:8080/info ,则网页输出

控制台输出

若输入的网址不符合,则页面出错,且不会执行postHandle以及afterCompletion方法

posted @ 2020-10-22 15:15  DurianTRY  阅读(87)  评论(0编辑  收藏  举报