jfinal-4.9 添加登录验证拦截器

登录的逻辑和简单

1.验证用账号和密码是否正确

2.正确,返回登录成功信息,同时将 user信息记录到session

3.正确,记录到redis,sso,登录日志等

因为的登录的业务逻辑和简单就不在这里贴代码了


登录完成之后,如何在其他url判断用户是否登录了呢?

[老掉牙的思路]

  1. 编写一个拦截器,判断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));
  }

然后测试

评论区