第二个参数用于重定向。
response.sendRedirect("/user/error");
执行这条语句将意味着直接跳转到这个指定的url。
完成后的代码:
@Configuration
public class MyInterceptor implements HandlerInterceptor {
@Autowired
IndexService indexService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String[] tokens=request.getParameterValues("token");
if (tokens==null) {
response.sendRedirect("/user/error");
return false;
}
String token=tokens[0];
if (indexService.findByToken(token)==false){
response.sendRedirect("/user/error");
return false;
}
if (indexService.findExpiredTimeByToken(token).before(new Date())){
response.sendRedirect("/user/error");
return false;
}
return true;
}
}
[](
)2. 将MyInterceptor类在自己的配置类MyMvcConfig中进行注册。
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Autowired
MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
List<String> excludePaths=new ArrayList<>();
excludePaths.add("/user/login/**");
excludePaths.add("/user/error");
registry.addInterceptor(myInterceptor).addPathPatterns("/user/**").excludePathPatterns(excludePaths);
//参数可以是单个路径的字符串,也可以是多个路径的list
}
}
[](
)3.Controller
在登陆的逻辑中,只需要添加token的生成、token以及过期时间的存储即可。返回当然要返回生成的token。
@RestController
@RequestMapping("/user")
public class IndexController {
@Autowired
IndexService indexService;
@GetMapping("/login/{user}")
public String login(@PathVariable int user){
return indexService.login(user);
}
@GetMapping("/service")
public String service(){
return "token right";
}
@GetMapping("/error")
public String error(){
return "error";
}
}
[](
)4.Service
@Service
public class IndexService {
Map<String,Integer> map= new HashMap<>();
Map<String, Date> map2=new HashMap<>();
public Boolean findByToken(String token){
if (map.get(token)==null) return false;else return true;
}
public Date findExpiredTimeByToken(String token){
return map2.get(token);
}
public String login(Integer user){
String token= UUID.randomUUID().toString();
map.put(token,user);
map2.put(token,new Date(System.currentTimeMillis()+60*1000));
return token;
}
}
这里用两个map模拟了数据库,当登陆成功的时候,map将自动生成token,并存储token、过期时间、用户id。过期时间暂定为1分钟。