• 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方法

    由于无法解释的神圣旨意,我们徒然地到处找你;你就是孤独,你就是神秘,比恒河或者日落还要遥远。。。。。。
  • 相关阅读:
    NAVICAT 拒绝链接的问题
    .net垃圾回收-原理浅析
    C#中标准Dispose模式的实现
    Windbg调试托管代码
    C#泛型基础
    .Net垃圾回收和大对象处理
    C++ 小知识点
    C++之虚函数表
    C++之指针与引用,函数和数组
    C++之const关键字
  • 原文地址:https://www.cnblogs.com/momoli/p/13858435.html
Copyright © 2020-2023  润新知