• SpringBoot配置拦截器实现登录之后才能调用api接口


    配置一个拦截器

    @Component
    public class LoginInterceptor implements HandlerInterceptor {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
            if (request.getSession().getAttribute(Constant.CURRENT_USER) == null) {
                response.setStatus(RestResponseEnum.LOGIN_TIMEOUT.getCode());
                return false;
            } else {
                return true;
            }
        }
    
    }

    配置一个WebConfig

    @Configuration
    public class WebConfig implements WebMvcConfigurer {
    
        @Autowired
        private LoginInterceptor loginInterceptor;
    
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
         // 只有登录接口才会被拦截到 registry.addInterceptor(loginInterceptor).addPathPatterns(
    "/**").excludePathPatterns("/v1/login", "/v1/admin/login"); } }

    LoginController

    @RestController
    public class LoginController {

    @Autowired
    private LoginService loginService;

    @PostMapping("/v1/login")
    public Object login(@RequestBody UserBean userBean, HttpServletRequest request, HttpServletResponse response) {
    if (loginService.checkLogin(userBean)) {
    response.setStatus(RestResponseEnum.SUCCESS.getCode());
    request.getSession().setAttribute(Constant.CURRENT_USER, userBean);
    return userBean;
    }
    RestResponseEnum loginError = RestResponseEnum.LOGIN_ERROR;
    return RestErrorResponse.build().setErrorCode(loginError.getCode()).setMessage(loginError.getMsg()).getResult();
    }

    @PostMapping(value = "/v1/logout")
    public void logout(HttpServletRequest request, HttpServletResponse response) {
    if (loginService.getCurrentUser(request.getSession()) != null) {
    request.getSession().invalidate();
    response.setStatus(RestResponseEnum.SUCCESS.getCode());
    }
    }
    }

    LoginService

    @Service
    public class LoginService {
    
        @Autowired
        private UserService userService;
    public boolean checkLogin(UserBean userBean) {
    User userOptional = userService.selectByPrimaryKey(userBean.getUserName());
            if (userOptional == null)) {
                return false;
            } else if (!Md5EncryptionUtil.encrypt(userBean.getPassword()).equals(userOptional.getPassword())) {
                return false;
            } else {
                userBean.setPassword(null);
                userBean.setLoginTime(System.currentTimeMillis());
                userBean.setNickName(userOptional.getNickname());
                userBean.setEmail(userOptional.getEmail());
                return true;
            }
        }public UserBean getCurrentUser(HttpSession session) {
            UserBean userBean = (UserBean) session.getAttribute(Constant.CURRENT_USER);
            return userBean;
        }
    
    
    }

    UserBean

    @Data
    public class UserBean {
    
        private String userName;
    
        private String password;
    
        private String newPassword;
    
        private String nickName;
    
        private String email;
    
        private String resultMsg = "";
    
        private Long loginTime;
    
        private Integer errorType;
    
        public UserBean() {
    
        }
    
        public UserBean(User user) {
            userName = user.getUserName();
            password = user.getPassword();
            newPassword = "";
            nickName = user.getNickname();
            email = user.getEmail();
            loginTime = System.currentTimeMillis();
        }
    
    }

    Constant

    public class Constant {
    
        //保存用户信息的session
        public static final String CURRENT_USER = "CURRENT_USER";
    }

    controller返回值

    public class RestErrorResponse {
        private Integer errorCode;
        private String message;
        private Object details;
        private JSONObject result;
    
    
        private RestErrorResponse() {
        }
    
        public static RestErrorResponse build() {
            return new RestErrorResponse();
        }
    
        public Integer getErrorCode() {
            return errorCode;
        }
    
        public RestErrorResponse setErrorCode(Integer errorCode) {
            this.errorCode = errorCode;
            return this;
        }
    
        public String getMessage() {
            return message;
        }
    
        public RestErrorResponse setMessage(String message) {
            this.message = message;
            return this;
        }
    
        public Object getDetails() {
            return details;
        }
    
        public RestErrorResponse setDetails(Object details) {
            this.details = details;
            return this;
        }
    
        public void setResult(JSONObject result) {
            this.result = result;
        }
    
        @Override
        public String toString() {
            return getResult();
        }
    
        public String getResult() {
            result = new JSONObject();
            JSONObject errorJson = new JSONObject();
            errorJson.put("code", errorCode);
            errorJson.put("message", message);
            errorJson.put("details", details);
            result.put("error", errorJson);
            return result.toString();
        }
    
    
    }

    错误枚举

    public enum RestResponseEnum {
        /* */
        SUCCESS(200, "成功"),
        UNKNOWN_ERROR(-1, "未知错误"),
    
        EQUIPMENT_ERROR(511, "操作设备失败"),
    
        EXCEL_DOWNLOAD_ERROR(516, "EXCEL下载失败"),
        EXCEL_UPLOAD_ERROR(517, "EXCEL上传失败"),
        /* error result about login*/
        LOGIN_ERROR(501, "用户登录失败"),
        ADMIN_LOGIN_ERROR(502, "管理员登录失败"),
    
        /*  error result about user*/
        USER_ERROR(506, "操作用户失败"),
    
        LOGIN_TIMEOUT(600, "登录超时");
    
        private Integer code;
        private String msg;
    
        RestResponseEnum(Integer code, String msg) {
            this.code = code;
            this.msg = msg;
        }
    
        public Integer getCode() {
            return code;
        }
    
        public String getMsg() {
            return msg;
        }
    
    }

    session有效时间

    application.yml

    server:
      port: 9000
      servlet:
        session:
          timeout: 10m
  • 相关阅读:
    慎用SELECT INTO复制表
    Log4net 配置使用总结(一)
    清除Chrome浏览器的历史记录、缓存
    System.Runtime.InteropServices.COMException (0x80040154)错误
    MS SQL开发命名规则
    查看数据库、表、索引的物理存储情况
    (转)ASP.NET调用javascript脚本的方法总结
    SQL Server ——动态SQL
    SQL性能调优实践——SELECT COUNT
    养成随时注释的好习惯
  • 原文地址:https://www.cnblogs.com/zhanzhuang/p/12015557.html
Copyright © 2020-2023  润新知