登录的逻辑和简单
1.验证用账号和密码是否正确
2.正确,返回登录成功信息,同时将 user信息记录到session
3.正确,记录到redis,sso,登录日志等
因为的登录的业务逻辑和简单就不在这里贴代码了
登录完成之后,如何在其他url判断用户是否登录了呢?
[老掉牙的思路]
编写一个拦截器,判断url是否需要被拦截,如果需要被拦截,判断session是否存在,如果存在允许访问url,如果不存在,重定向到登录界面
拦截器代码
package com.litong.jfinal.interceptor; import com.jfinal.aop.Interceptor; import com.jfinal.aop.Invocation; import com.jfinal.core.Controller; import com.litong.utils.vo.JsonBean; import com.litong.utils.vo.UserModel; import com.litong.utils.web.WebUtils; import lombok.extern.slf4j.Slf4j; /** * @author bill robot * @date 2020年8月29日_下午10:27:47 * @version 1.0 * @desc 用户登录验证拦截器 */ @Slf4j public class AuthInterceptor implements Interceptor { /** * 排除url前缀 */ private String[] excluede; public AuthInterceptor(String... prefix) { int len = prefix.length; excluede = new String[len]; for (int i = 0; i < len; i++) { excluede[i] = prefix[i]; } } @Override public void intercept(Invocation inv) { // 1.比较排除前缀是否匹配,配置直接放行, String actionKey = inv.getActionKey(); for (String string : excluede) { if (actionKey.startsWith(string)) { inv.invoke(); return; } } // 2.不匹配获取session中的值,没有返回有错误信息的json Controller controller = inv.getController(); UserModel user = WebUtils.getUser(controller.getRequest()); if (user == null) { String mesage="user not login"; log.info(mesage); controller.renderJson(new JsonBean<Void>(-1,mesage)); controller.redirect("/login.html"); } else { inv.invoke(); } } }
在启动类中添加拦截器
@Override public void configInterceptor(Interceptors me) { // 1.全局异常拦截器 me.addGlobalActionInterceptor(new ExceptionInterceptor()); // 2.登录验证拦截器 String[] ignoreUrl = { "/version", "/path", "/api/users", "/api/role", "/face" }; me.add(new AuthInterceptor(ignoreUrl)); }
然后测试