说明:
(1)本篇博客内容:开发【查询admin用户名是否已存在,接口】;
目录
一:开发【查询admin用户名是否已存在,接口】;
0.合理性说明;
1.在【api】接口工程的AdminMngControllerApi接口中,定义【查询admin用户名是否已存在,接口】;
2.在【admin】管理服务的AdminMngController类中,去实现【查询admin用户名是否已存在,接口】;
3.测试;
4.【查询admin用户名是否已存在,接口】,也是需要用户在登录的时候,才能够操作的;
(1)首先,在【api】接口工程中,创建AdminTokenInterceptor拦截器,去拦截请求,根据请求判断用户是登录状态;
(2)然后,在【api】接口工程中,在InterceptorConfig类,去配置AdminTokenInterceptor拦截器;
(3)效果;
一:开发【查询admin用户名是否已存在,接口】;
0.合理性说明;
在【49:第五章:开发admin管理服务:2:开发【管理员登录】接口;】中,管理员用户登录后,会跳转到下面这个页面;
然后,我们就可以去设置管理员用户了;
● 前面也提到了,管理员的登录名是不允许重名的;所以,我们在前端浏览器上输入"登录名"的时候,前端代码会捕获这输入动作;然后,其会自动调用后端相应的接口,去检查输入的登录名是否存在重名的情况;
● 所以,我们先去开发【查询admin用户名是否已存在,接口】;
在【49:第五章:开发admin管理服务:2:开发【管理员登录】接口;】中,管理员用户登录后,会跳转到下面这个页面;
然后,我们就可以去设置管理员用户了;
● 前面也提到了,管理员的登录名是不允许重名的;所以,我们在前端浏览器上输入"登录名"的时候,前端代码会捕获这输入动作;然后,其会自动调用后端相应的接口,去检查输入的登录名是否存在重名的情况;
● 所以,我们先去开发【查询admin用户名是否已存在,接口】;
1.在【api】接口工程的AdminMngControllerApi接口中,定义【查询admin用户名是否已存在,接口】;
@ApiOperation(value = "查询admin用户名,是否已存在", notes = "查询admin用户名,是否已存在", httpMethod = "POST")
@PostMapping("/adminIsExist") //设置路由,这个是需要前后端约定好的;
public GraceJSONResult adminIsExist(@RequestParam String username);
说明:
(1)这个接口的url,请求方式,参数;不是瞎写的,前后端需要保持一致;
@ApiOperation(value = "查询admin用户名,是否已存在", notes = "查询admin用户名,是否已存在", httpMethod = "POST")
@PostMapping("/adminIsExist") //设置路由,这个是需要前后端约定好的;
public GraceJSONResult adminIsExist(@RequestParam String username);
说明:
(1)这个接口的url,请求方式,参数;不是瞎写的,前后端需要保持一致;
2.在【admin】管理服务的AdminMngController类中,去实现【查询admin用户名是否已存在,接口】;
@Override
public GraceJSONResult adminIsExist(String username) {
checkAdminExist(username);//【判断admin用户名,是否已存在】的逻辑,我们单独抽成了一个方法;
return GraceJSONResult.ok();
}
private void checkAdminExist(String username) {
// 1.调用Service层的方法,根据用户名,尝试去数据库中查,看是否有这个用户;
AdminUser adminUser = adminUserService.queryAdminByUsername(username);
if (adminUser != null) {
//如果该管理员name已存在,直接抛一个包含"管理员登录名已存在!"信息的MyCustomException自定义异常;
GraceException.display(ResponseStatusEnum.ADMIN_USERNAME_EXIST_ERROR);
}
}
说明:
(1)service层的【根据"管理员用户名",查询管理员用户的方法queryAdminByUsername(username);】在上篇博客中,已经开发好了;
(2)【根据"管理员用户名",查询管理员用户;】这个逻辑,我们单独抽成了一个方法;
@Override
public GraceJSONResult adminIsExist(String username) {
checkAdminExist(username);//【判断admin用户名,是否已存在】的逻辑,我们单独抽成了一个方法;
return GraceJSONResult.ok();
}
private void checkAdminExist(String username) {
// 1.调用Service层的方法,根据用户名,尝试去数据库中查,看是否有这个用户;
AdminUser adminUser = adminUserService.queryAdminByUsername(username);
if (adminUser != null) {
//如果该管理员name已存在,直接抛一个包含"管理员登录名已存在!"信息的MyCustomException自定义异常;
GraceException.display(ResponseStatusEnum.ADMIN_USERNAME_EXIST_ERROR);
}
}
说明:
(1)service层的【根据"管理员用户名",查询管理员用户的方法queryAdminByUsername(username);】在上篇博客中,已经开发好了;
(2)【根据"管理员用户名",查询管理员用户;】这个逻辑,我们单独抽成了一个方法;
3.测试;
(1)先全局install一下整个项目;
(2)然后,启动前端项目;记得使用SwitchHost开启虚拟域名映射;
(3)启动【admin】管理服务的主启动类;
……………………………………………………
(4)然后,输入不同的admin用户名;
(1)先全局install一下整个项目;
(2)然后,启动前端项目;记得使用SwitchHost开启虚拟域名映射;
(3)启动【admin】管理服务的主启动类;
……………………………………………………
(4)然后,输入不同的admin用户名;
4.【查询admin用户名是否已存在,接口】,也是需要用户在登录的时候,才能够操作的;
PS:这一点在【36:第三章:开发通行证服务:19:拦截那些“想要访问【获得用户账户信息,接口】和【更改/完善用户信息,接口】的请求“,检查登录信息,校验通过后再放行;(使用【Spring MVC中的拦截器】来实现)】、【44:第四章:开发文件服务:5:在【files】文件服务中,整合FastDFS,实现【上传头像】的逻辑;】中都有设置;
(1)首先,在【api】接口工程中,创建AdminTokenInterceptor拦截器,去拦截请求,根据请求判断用户是登录状态;
package com.imooc.api.interceptors;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AdminTokenInterceptor extends BaseInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//首先,尝试从请求的header中,获取"adminUserId"和"adminUserToken";
// 也就是获取,前面在调用【查询admin用户名是否已存在,接口】时设置进前端浏览器cookie中的"uid"和"utoken";
// PS:前端在发起请求的时候,前端程序会把cookie中"uid"和"utoken"设置进请求头;然后,设置的时候,其名字就分别设置为了"adminUserId"和"adminUserToken";
// 所以,这儿别瞎写,一定要和前端写的保持一致;
// PS:如果这个请求的header中没有"adminUserId"和"adminUserToken",其获取的就是空;
String userId = request.getHeader("adminUserId");
String token = request.getHeader("adminUserToken");
//调用BaseInterceptor中编写的方法,判断一下请求的header中的"adminUserId"和"adminUserToken"是否OK;
// 也就是说,判断一个前端用户是否是登录的;
boolean run = verifyUserIdToken(userId, token,REDIS_ADMIN_TOKEN);
System.out.println(run);
//如果上面的verifyUserIdToken()执行没问题,那么就说当前用户是登录的了,
// 就能走到这一步,直接return true,放行这个请求,让其去访问【更改/完善用户信息,接口】、【获得用户账户信息,接口】;
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
说明:
(1)这儿的写法,可以参考 【36:第三章:开发通行证服务:19:拦截那些“想要访问【获得用户账户信息,接口】和【更改/完善用户信息,接口】的请求“,检查登录信息,校验通过后再放行;(使用【Spring MVC中的拦截器】来实现)】;
(2)从请求头中,尝试获取"adminUserId"和"adminUserToken";这俩,别瞎写,需要前后端保持一致;
(3)我们需要在BaseInterceptor中,定义REDIS_ADMIN_TOKEN;(用户获取管理员用户登录时,存到redis中的token)
(2)然后,在【api】接口工程中,在InterceptorConfig类,去配置AdminTokenInterceptor拦截器;
@Bean
public AdminTokenInterceptor adminTokenInterceptor() {
return new AdminTokenInterceptor();
}
// 【查询admin用户名是否已存在,接口】是需要登录才能操作的;
registry.addInterceptor(adminTokenInterceptor())
.addPathPatterns("/adminMng/adminIsExist");
(3)效果;
先全局install一下整个项目;然后,启动前端项目;记得使用SwitchHost开启虚拟域名映射;启动【admin】管理服务的主启动类;
如果,我们清除掉cookie信息,让其不再是登录状态;
PS:这一点在【36:第三章:开发通行证服务:19:拦截那些“想要访问【获得用户账户信息,接口】和【更改/完善用户信息,接口】的请求“,检查登录信息,校验通过后再放行;(使用【Spring MVC中的拦截器】来实现)】、【44:第四章:开发文件服务:5:在【files】文件服务中,整合FastDFS,实现【上传头像】的逻辑;】中都有设置;
(1)首先,在【api】接口工程中,创建AdminTokenInterceptor拦截器,去拦截请求,根据请求判断用户是登录状态;
package com.imooc.api.interceptors;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AdminTokenInterceptor extends BaseInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//首先,尝试从请求的header中,获取"adminUserId"和"adminUserToken";
// 也就是获取,前面在调用【查询admin用户名是否已存在,接口】时设置进前端浏览器cookie中的"uid"和"utoken";
// PS:前端在发起请求的时候,前端程序会把cookie中"uid"和"utoken"设置进请求头;然后,设置的时候,其名字就分别设置为了"adminUserId"和"adminUserToken";
// 所以,这儿别瞎写,一定要和前端写的保持一致;
// PS:如果这个请求的header中没有"adminUserId"和"adminUserToken",其获取的就是空;
String userId = request.getHeader("adminUserId");
String token = request.getHeader("adminUserToken");
//调用BaseInterceptor中编写的方法,判断一下请求的header中的"adminUserId"和"adminUserToken"是否OK;
// 也就是说,判断一个前端用户是否是登录的;
boolean run = verifyUserIdToken(userId, token,REDIS_ADMIN_TOKEN);
System.out.println(run);
//如果上面的verifyUserIdToken()执行没问题,那么就说当前用户是登录的了,
// 就能走到这一步,直接return true,放行这个请求,让其去访问【更改/完善用户信息,接口】、【获得用户账户信息,接口】;
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
说明:
(1)这儿的写法,可以参考 【36:第三章:开发通行证服务:19:拦截那些“想要访问【获得用户账户信息,接口】和【更改/完善用户信息,接口】的请求“,检查登录信息,校验通过后再放行;(使用【Spring MVC中的拦截器】来实现)】;
(2)从请求头中,尝试获取"adminUserId"和"adminUserToken";这俩,别瞎写,需要前后端保持一致;
(3)我们需要在BaseInterceptor中,定义REDIS_ADMIN_TOKEN;(用户获取管理员用户登录时,存到redis中的token)
(2)然后,在【api】接口工程中,在InterceptorConfig类,去配置AdminTokenInterceptor拦截器;
@Bean
public AdminTokenInterceptor adminTokenInterceptor() {
return new AdminTokenInterceptor();
}
// 【查询admin用户名是否已存在,接口】是需要登录才能操作的;
registry.addInterceptor(adminTokenInterceptor())
.addPathPatterns("/adminMng/adminIsExist");
(3)效果;
先全局install一下整个项目;然后,启动前端项目;记得使用SwitchHost开启虚拟域名映射;启动【admin】管理服务的主启动类;
如果,我们清除掉cookie信息,让其不再是登录状态;



