- 1 前言
- 2 我的实现方式与存在的问题
- 3 我想到的解决方案
- 4 其他相关代码
1 前言
在做工程实践项目的管理员模块时,我想实现下面的效果:
- 1)在未登录状态下通过url访问 /pages/admin/** 下的静态页面,除了 login.html,其他都会被拦截,然后跳转到 login.html 页面;
- 2)在 login.html 页面登录后,会自动跳转到 /pages/admin/index.html 页面;
先给个效果图,对应的是:解决方案 3.3 放弃后端对/pages/admin/** 下静态页面的拦截,在前端做登录检测和跳转
对录屏软件感兴趣的请戳:Apowersoft 免费在线录屏
2 我的实现方式与存在的问题
1)后端定义 JWTAdminInterceptor.java 来验证登录状态,如果未登录则重定向到 /pages/admin/login.html 页面。代码如下:
1 /** 2 * JWT验证拦截器(管理员),对于需要身份认证的请求,必须先经过该拦截器处理 3 * @author southday 4 * @date 2019/2/26 5 */ 6 public class JWTAdminInterceptor extends HandlerInterceptorAdapter { 7 private static final Logger logger = LogManager.getLogger(JWTAdminInterceptor.class); 8 9 @Autowired 10 private AdminService adminService; 11 12 @Override 13 public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception { 14 String jws = JWTer.getToken(); 15 JWTer jwter = new JWTer(jws); 16 boolean flag = false; 17 if (!jwter.isUsable()) { 18 logger.info("权限验证失败,异常:" + jwter.getException().getMessage() + " | [token = " + jws + "]"); 19 } else if (!CommonConst.USER_TYPE_ADMIN.equals(jwter.getUserType())) { 20 logger.info("权限验证失败,用户类型不匹配,[token = " + jws + "]"); 21 } else { 22 flag = adminService.isAdminExists(jwter.getUserName()); 23 } 24 if (!flag) { 25 resp.setStatus(401); 26 resp.sendRedirect("/idevtools/pages/admin/login.html"); 27 } 28 return flag; 29 } 30 }
2)spring-mvc.xml 拦截器配置如下:拦截器中配置了对 /pages/admin/** 下的所有静态页面进行拦截,除了 /pages/admin/login.html 页面;
1 <!-- 拦截器配置 southday 2019.02.26 --> 2 <mvc:interceptors> 3 <!-- JWT 身份验证拦截器,针对管理员需要先进行登陆后才能操作的请求进行拦截 --> 4 <mvc:interceptor> 5 <mvc:mapping path="/a/**"/> 6 <!-- 配置管理员模块静态页面的拦截 southday 2019.05.17 --> 7 <mvc:mapping path="/pages/admin/**"/> 8 <mvc:exclude-mapping path="/a/login"/> 9 <mvc:exclude-mapping path="/a/adminInfo"/>