SpringBoot基础-拦截器

创建项目

创建Spring Boot项目

 项目整体如下:

SpringBoot基础-拦截器_第1张图片

①创建数据库,表;插入数据

CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL COMMENT '名字',
  `balance` double(255,0) DEFAULT NULL COMMENT '余额',
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='用户测试表';

配置数据库 

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/springboot_demo?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
    username: root
    password: 密码
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  typeAliasesPackage: com.qcby.entity
  mapperLocations: classpath:mapper/*.xml
  # 全局配置id自增  =>
  global-config:
    db-config:
      id-type: auto

 ②创建config.MybatisPlusConfig 类,引入mybatis-plus

@Configuration
public class MybatisPlusConfig {
    // 最新版
    @Bean  // 
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

③pow.xml刷新依赖,添加mybatis-plus依赖

        
        
            com.baomidou
            mybatis-plus-boot-starter
            3.4.2
        
        
            mysql
            mysql-connector-java
            runtime
        

④entity包中创建User实体类

//Lombok提供的注解
@Data
@TableName("user")
public class User {
    private Long id;
    private String name;
    private String balance;
    private String username;
    private String password;
}

 ⑤创建mapper.UserMapper接口

public interface UserMapper extends BaseMapper {
   
}

⑥创建service.UserService接口

public interface UserService extends IService {
    
}

⑦创建service.impl.UserServiceImpl 类

@Service
public class UserServiceImpl extends ServiceImpl implements UserService {
    @Resource
    private UserMapper userMapper;
}

⑧创建controller.UserController类

@RestController
@RequestMapping("login")
public class UserController {
    @Autowired
    private UserServiceImpl service;
}

session方式

①创建config.WebMvcConfig类,继承WebMvcConfigurer,添加@Configuration注解

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor())
                //拦截的路径(*所有)
                .addPathPatterns("/**")
                // 那些路径不拦截
                .excludePathPatterns("/login/**","/error");
    }

    @Bean
    public LoginInterceptor loginInterceptor(){
        return new LoginInterceptor();
    }
}

②创建UserController类

@RestController
@RequestMapping("login")
public class UserController {
    @Autowired
    private UserServiceImpl service;
    @Autowired
    private HttpSession session;

    @RequestMapping(value = "login",method = RequestMethod.GET)
    public Map login(User user){
        Map map = new HashMap<>();
        map.put("code",0);
        if(StringUtils.isEmpty(user.getUsername()) || StringUtils.isEmpty(user.getPassword()) ){
            map.put("msg","用户或者密码为空!");
            return map;
        }
        QueryWrapper queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username",user.getUsername())
                .eq("password",user.getPassword());
        User userDb = service.getOne(queryWrapper);
        if(userDb != null){
            map.put("code",1);
            map.put("data",userDb);
            //重点在这里
            session.setAttribute("username",userDb.getUsername());

        }else{
            map.put("msg","用户名或密码错误!");
        }
        return map;
    }

    //退出
    @RequestMapping("logout")
    public String logout(){
        session.removeAttribute("username");
        return "login";
    }
}

③创建interceptor.LogIninterceptor类,实现HandlerInterceptor接口

public class LoginInterceptor implements HandlerInterceptor {

    private Logger log = LoggerFactory.getLogger(getClass());

    @Autowired
    private HttpSession httpSession;

    //Controller逻辑执行之前
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle....");
        String uri = request.getRequestURI();
        System.out.println("uri:"+ uri);

        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
        //与Session呼应
        //重点
        if (httpSession.getAttribute("username") == null) {
            // 未登录跳转到登录界面
            response.sendRedirect("/login/login");
            return false;
        } else {
            return true;
        }
       
    }
    //Controller逻辑执行完毕但是视图解析器还未进行解析之前
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle....");
    }

    //Controller逻辑和视图解析器执行完毕
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("afterCompletion....");
    }

④测试:创建Test 类

@RestController
@RequestMapping("test")
public class Test {
    @RequestMapping("getInfo")
    public List getInfo(HttpServletRequest request){
        return service.list();
    }
}

没有登录:

SpringBoot基础-拦截器_第2张图片

登录之后:

SpringBoot基础-拦截器_第3张图片

token方式 

①继续使用WebMvcConfig类

②创建token.TokenUtil类

public class TokenUtil {
    private static Map tokenMap=new HashMap<>();

    public static String generateToken(User user){
        String token= UUID.randomUUID().toString();
        tokenMap.put(token,user);
        return token;
    }

    public static boolean verify(String token){
        return tokenMap.containsKey(token);
    }

    public static User getUser(String token){
        return tokenMap.get(token);
    }
}

③编辑UserController类,只修改session的部分即可

@RestController
@RequestMapping("login")
public class UserController {
    @Autowired
    private UserServiceImpl service;
    @Autowired
    private HttpSession session;


    @ApiOperation("登录接口")
    @RequestMapping(value = "login",method = RequestMethod.GET)
    public Map login(User user){
        Map map = new HashMap<>();
        map.put("code",0);
        if(StringUtils.isEmpty(user.getUsername()) || StringUtils.isEmpty(user.getPassword()) ){
            map.put("msg","用户或者密码为空!");
            return map;
        }
        QueryWrapper queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username",user.getUsername())
                .eq("password",user.getPassword());
        User userDb = service.getOne(queryWrapper);
        if(userDb != null){
            map.put("code",1);
            map.put("data",userDb);
            //session.setAttribute("username",userDb.getUsername());
            //重点
            String token= TokenUtil.generateToken(userDb);
            map.put("qcby-token",token);

        }else{
            map.put("msg","用户名或密码错误!");
        }
        return map;
    }
}

④修改LoginInterceptor 类

public class LoginInterceptor implements HandlerInterceptor {

    private Logger log = LoggerFactory.getLogger(getClass());

    @Autowired
    private HttpSession httpSession;


    //Controller逻辑执行之前
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle....");
        String uri = request.getRequestURI();
        System.out.println("uri:"+ uri);
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
        String token=request.getHeader("qcby-token");
        if (!TokenUtil.verify(token)) {
            // 未登录跳转到登录界面
            response.sendRedirect("/login/login");
            return false;
        }else {
            return true;
        }
    }

    //Controller逻辑执行完毕但是视图解析器还未进行解析之前
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle....");
    }

    //Controller逻辑和视图解析器执行完毕
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("afterCompletion....");
    }
}

⑤测试(postman测试)

没有登录:SpringBoot基础-拦截器_第4张图片

  登录之后:

SpringBoot基础-拦截器_第5张图片

SpringBoot基础-拦截器_第6张图片

你可能感兴趣的:(Spring,Boot,spring,boot,java)