zoukankan      html  css  js  c++  java
  • 简单使用拦截器实现登录+拦截器

    拦截器

    参考b站狂神视频

    Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。

    拦截器(Interceptor):它依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用,就是在service或者一个方法前,调用一个方法,或者在方法后,调用一个方法,比如动态代理就是拦截器的简单实现,在调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在调用方法后打印出字符串,甚至在抛出异常的时候做业务逻辑的操作。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。

    拦截器重写三个方法,详见参考,其与过滤器的区别参考 https://blog.csdn.net/zxd1435513775/article/details/80556034

    为了解决 用户可以不登陆便可进入主页,这是不安全的,为了解决这个问题,便可使用拦截器。

    一、新建登录拦截器

    LoginHandlerIntercepter.java

    package com.example.employee_management.config;

    import org.springframework.web.servlet.HandlerInterceptor;

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

    /**
    * @className: LoginHandlerIntercepter
    * @description: 登录拦截器
    */
    public class LoginHandlerIntercepter implements HandlerInterceptor {

       @Override
       public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

           //获取登录用户的session
           Object loginUser=request.getSession().getAttribute("loginUser");

           //session不存在,即用户尚未登录
           if(loginUser==null){
               request.setAttribute("msg","请先登录");
               //返回首页
               request.getRequestDispatcher("/index.html").forward(request,response);

               return false;

          }else {
               return true;
          }

      }
    }

    二、在MVC配置类中添加登录拦截器

    MyMvcConfig.java

    package com.example.employee_management.config;

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

    /**
    * @className: MyMvcConfig
    * @description: MVC 控制器 借助注解完成控制器而不用手动编写
    */
    @Configuration
    public class MyMvcConfig implements WebMvcConfigurer {

       /**
        * MVC 添加首页控制器
        *
        * @param registry
        */
       @Override
       public void addViewControllers(ViewControllerRegistry registry) {
           //这里 “/”和“/index.html”效果一样,因为web项目默认页是index.html
           registry.addViewController("/").setViewName("index");
           registry.addViewController("/index.html").setViewName("index");

           //添加用户主页
           registry.addViewController("/main.html").setViewName("dashboard");
      }


       /**
        * 将国际化组件放入ioc容器中
        *
        * @return
        */
       @Bean
       public LocaleResolver localeResolver() {
           return new MyLocaleResolver();
      }


       /**
        * 添加登录拦截器
        * @param registry
        */
       @Override
       public void addInterceptors(InterceptorRegistry registry) {
           registry.addInterceptor(new LoginHandlerIntercepter()).addPathPatterns("/**")//对所有请求进行拦截
                  .excludePathPatterns("/index.html","/","/user/login","/css/**","/js/**","/img/**");此路径下请求的进行放行,可以是一些静态资源
      }
    }

    三、修改登录控制器:添加session来保证拦截器正常运行

    LoginController.java

    package com.example.employee_management.controller;

    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.util.StringUtils;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;

    import javax.servlet.http.HttpSession;

    @Controller
    public class LoginController {

       @RequestMapping("/user/login")
       public String login(@RequestParam("username")String username,
                           @RequestParam("password")String password, Model model,
                           HttpSession session){

           //用户名不为空且密码正确 注意这里的数据是默认密码为123456,便于调试
           if(!StringUtils.isEmpty(username) && "123456".equals(password)){
               session.setAttribute("loginUser",username);
               return "redirect:/main.html";
          }else {
               //用户名或密码错误
               model.addAttribute("msg","用户名或密码错误");
               return "index";
          }
      }
    }

    启动项目后,在浏览器中输入

    localhost:8080/main.html

    便会转入到首页(index.html),并且提示用户尚未登录。 在这里插入图片描述 登录拦截器的功能便已完成。

     

  • 相关阅读:
    从一个集合中查找最大最小的N个元素——Python heapq 堆数据结构
    算法导论第二章小试牛刀
    python网络编程初级
    python基础的几个小练习题
    LeetCode:114_Flatten Binary Tree to Linked List | 将一棵二叉树变成链表的形式 | Medium
    LeetCode:111_Minimum Depth of Binary Tree | 二叉树的最小深度 | Easy
    LeetCode:110_Balanced Binary Tree | 平衡二叉树 | Easy
    LeetCode: 106_Construct Binary Tree from Inorder and Postorder Traversal | 根据中序和后序遍历构建二叉树 | Medium
    mysql中json_object函数的使用?
    mysql中json_remove函数的使用?
  • 原文地址:https://www.cnblogs.com/bxbo/p/13476738.html
Copyright © 2011-2022 走看看