创建一个包叫:interceptor
新建一个类:LoginInterceptor,这个类需要是实现HandlerInterceptor 接口
public class LoginInterceptor implements HandlerInterceptor {
//点进去这个接口,按Alt+7,查看他的方法;我们需要重写preHandle方法
//需要先执行preHandle,再执行Cotroller层;preHandle就是拦截的作用
//@Override表示重写接口方法的注解
//当preHandle方法返回true,表示验证成功,继续向下执行,访问目标方法;返回false,表示验证未通过
//写好这部分后,需要将这部分与业务关联起来,就需要写配置了
/**
* @Description 重写前置处理逻辑:在访问spring mvc对应资源之前,会先进入这个方法
* @Date l 2021/8/18
* @Param boolean
**/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("我进入到了拦截器----,url:" + request.getRequestURI());
//从请求头获取到token令牌
String token = request.getHeader("token");
Boolean r = JwtUtill.verToken(token);
if(!r){
//登录验证失败
throw new RuntimeException("未登录!");
// 不执行目标方法了
}
/**
* 【可以获取到Controller中方法上任意注解的内容】
*/
// 获取目标方法对对应的内容
System.out.println("登录成功");
System.out.println(JwtUtill.getUser(token));
// 验证通过,执行目标方法,比如:listAll 、insert
return true;
}
}
再建一个config包,创建一个WebConfigMvc.java,这是一个MVC配置类,自定义拦截器拦截哪些路径和不拦截哪些路径
/**
* @ClassName WebConfigMvc
* @Description mvc 配置类
* @Author l
* @Date 2021/8/18 16:49
* @Version 1.0
**/
@Configuration
public class WebConfigMvc implements WebMvcConfigurer {
/**
* @Author liu-miss
* @Description 添加自定义拦截到spring mvc拦截链中 => 注册自定义拦截器
* @Date l 2021/8/18
* @Param void
* @return [registry]
**/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册自定义拦截器
registry.addInterceptor(loginInterceptor())
// 定拦截那些路径,/**代表所有
.addPathPatterns("/**")
// 那些路径不拦截,排除规则
.excludePathPatterns("/user/login/**");
}
// @Bean 等价于 => @Component => @Service => @Controller
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
}
接着创建util包,创建JwtUtill.java
/**
* @ClassName JwtUtill
* @Description 保存用户登录信息
* @Author l
* @Date 2021/8/18 17:41
* @Version 1.0
**/
public class JwtUtill {
/**
* 存储token信息: K-V键值对,key-String;value-User
* 类比服务端session池
*/
private static Map<String, User> tokenMap = new HashMap<>();
/**
* 登录成功,生成token=> token指一个令牌,代表你已经登录成功
* @param user
* @return
*
* 计划存储所有登录后的用户信息,key:唯一字符串,利用UUID生成
* value:用户信息
*/
public static String genToken(User user){
if(user == null){
return null;
}
// 通过UUID 生成的一个唯一的字符串
String token = UUID.randomUUID().toString();
tokenMap.put(token,user);
return token;
}
public static boolean verToken(String token){
if(tokenMap.get(token) == null){
return false;
}
return true;
}
public static User getUser(String token){
return tokenMap.get(token);
}
}
现在该从前台登录成功后获取token令牌了
@RequestMapping("login")
public String login(User user) {
if (StringUtils.isEmpty(user.getName()) || StringUtils.isEmpty(user.getPassword())) {
return null;
}
User userDb = userService.login(user);
String token = null;
if (userDb != null){
//登录成功,获取token
token = JwtUtill.genToken(userDb);
}
return token;
}
后台全部写完,利用postMan实现前台功能
1.登录成功,获取唯一表示字符串token
2.只有用户登录成功后才能查看listAll页面