SpringBoot之HandlerInterceptor拦截器的使用

前言
本篇博文是关于拦截器-HandlerInterceptor的使用,希望你能够喜欢

个人主页:晨犀主页
个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力
欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看
如果文章有什么需要改进的地方还请大佬不吝赐教 先在此感谢啦

文章目录

  • 拦截器-HandlerInterceptor
    • 基本介绍
      • 基本步骤:
    • 拦截器应用实例
      • 需求:
      • 代码实现
    • 注意事项和细节
      • URI 和URL 的区别
        • 举例说明:
    • 总结

拦截器-HandlerInterceptor

基本介绍

在Spring Boot 项目中, 拦截器是开发中常用手段,要来做登陆验证、性能检查、日志记录等。

基本步骤:

√ 编写一个拦截器实现HandlerInterceptor 接口
√ 拦截器注册到配置类中(实现WebMvcConfigurer 的addInterceptors)
√ 指定拦截规则

拦截器应用实例

需求:

使用拦截器防止用户非法登录, 如图- 使用拦截器就不需要在每个方法验证了
浏览器输入: http://localhost:8080/manage.html , 如果用户没有登录,则返回登录界面.

SpringBoot之HandlerInterceptor拦截器的使用_第1张图片

代码实现

  1. 创建com/my/usersys/interceptor/LoginInterceptor.javapackage com.
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {

	// 目标方法执行前被调用.
    @Override
    public boolean preHandle(HttpServletRequest request, 
                             HttpServletResponse response, Object handler) throws Exception {
        //为了让小伙伴看到访问的URI
        String requestURI = request.getRequestURI();
        String requestURL = request.getRequestURL().toString();
        log.info("preHandle拦截到的请求的URI={}", requestURI);
        log.info("preHandle拦截到的请求的URL={}", requestURL);

        //进行登录的校验
        HttpSession session = request.getSession();
        Object loginAdmin = session.getAttribute("loginAdmin");
        if (null != loginAdmin) {//说明该用户已经成功登录
            //放行
            return true;
        }
        //拦截, 重新返回到登录页面
        request.setAttribute("msg", "你没有登录/请登录~~");
        request.getRequestDispatcher("/").forward(request, response);
        return false;
    }
	//目标方法执行完成以后调用
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, 
                           Object handler, ModelAndView modelAndView) throws Exception {
        log.info("postHandle执行了...");
    }
	//页面渲染以后调用
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
                                Object handler, Exception ex) throws Exception {
        log.info("afterCompletion执行了...");
    }
}
  1. 创建com/my/usersys/config/WebConfig.java
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        //注册自定义拦截器LoginInterceptor
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**") //拦截所有的请求
                .excludePathPatterns("/","/login","/images/**");
        //指定要放行的,后面可以根据业务需求,来添加放行的请求路径
    }
}
  1. 修改com/my/usersys/controller/AdminController.java , 去掉session 验证用户是否登录代码, 并完成测试, 注意看页面和后台日志.
//处理用户的请求到 manage.html
    @GetMapping("/manage.html")
    public String mainPage(Model model, HttpSession session) {
         log.info("进入mainPage()");
        //可以这里集合-模拟用户数据, 放入到request域中,并显示
        ArrayList<User> users = new ArrayList<>();
        users.add(new User(1, "关羽~", "666666", 20, "[email protected]"));
        users.add(new User(2, "张飞", "666666", 30, "[email protected]"));
        users.add(new User(3, "赵云", "666666", 22, "[email protected]"));
        users.add(new User(4, "马超", "666666", 28, "[email protected]"));
        users.add(new User(5, "黄忠", "666666", 50, "[email protected]"));

        //放入model的数据默认到request域
        model.addAttribute("users", users);

        return "manage"; //这里才是我们的视图解析到 /templates/manage.html
    }

SpringBoot之HandlerInterceptor拦截器的使用_第2张图片

SpringBoot之HandlerInterceptor拦截器的使用_第3张图片

注意事项和细节

URI 和URL 的区别

URI = Universal Resource Identifier
URL = Universal Resource Locator
Identifier:标识符,Locator:定位器从字面上来看, URI 可以唯一标识一个资源, URL 可以提供找到该资源的路径

举例说明:

String requestURI = request.getRequestURI();
String requestURL = request.getRequestURL().toString();

注册拦截器, 依然可以使用如下方式

public class WebConfig /*implements WebMvcConfigurer*/ {
	//将我们的拦截器, 注入到容器中
    //@Override
    //public void addInterceptors(InterceptorRegistry registry) {
    //
    //    //注册自定义拦截器LoginInterceptor
    //    registry.addInterceptor(new LoginInterceptor())
    //            .addPathPatterns("/**") //拦截所有的请求
    //            .excludePathPatterns("/","/login","/images/**");
    //指定要放行的,后面可以根据业务需求,来添加放行的请求路径
    //}

    @Bean
    public WebMvcConfigurer webMvcConfigurer() {

        return new WebMvcConfigurer() {
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                System.out.println("addInterceptors~~~");
                //注册拦截器
                registry.addInterceptor(new LoginInterceptor())
                        .addPathPatterns("/**")
                        .excludePathPatterns("/","/login","/images/**");
            }
        };
    }
}

总结

  1. URI 可以唯一标识一个资源, URL 可以提供找到该资源的路径。
  2. 拦截所有的请求时要注意哪些资源需要放行,防止无法请求。
  3. 拦截器注册到配置类中(实现WebMvcConfigurer 的addInterceptors),一定要指定拦截规则。

热门专栏推荐

Thymeleaf快速入门及其注意事项

Spring Initailizr–快速入门–SpringBoot的选择

带你了解SpringBoot支持的复杂参数–自定义对象参数-自动封装

Rest 优雅的url请求处理风格及注意事项

文章到这里就结束了,如果有什么疑问的地方请指出,诸大佬们一起来评论区一起讨论
希望能和诸大佬们一起努力,今后我们一起观看感谢您的阅读
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力

你可能感兴趣的:(SpringBoot,服务器,运维,spring,boot,后端)