SSM项目下的登录拦截

1、前端传数据给前端

  把数据放到cookie中或者localStorage

 登录JS

    /**
     * 登录操作
     */
    function checkCode(email,code){
        $.post("checkCode?email="+email+"&code="+code,function (response){
            console.log(response.status);
            //验证码错误
            if (response.status == 3002) {
                //显示
                alert(response.message);
                location.replace("login.html");
            }
            if (response.status == 2000) {
                //跳转页面 获取邮箱验证码
                window.localStorage.setItem("admin",JSON.stringify(response.data))
                location.replace("/toMain");
            }
        });
    }

 

 主页JS

    $(function (){
        var admin = JSON.parse(localStorage.getItem("admin"))
        console.log(admin)
        if (admin!=null){
            if (admin.adminAvatar){
                $("#adminAvatar").attr("src",admin.adminAvatar)
            }
            if (admin.adminName){
                $("#adminName").text(admin.adminName)
            }
        }
    })

 

2、登录拦截

  把用户信息保存到session返回给前端,前端每次请求时后台检测session中有没有用户信息,有就允许请求,没有就抛出自定义异常,返回一个状态码给前端,前端检测到这个状态码会重定向到指定页

  注意:异步请求重定向失效

1、把用户信息保存到session返回给前端

Controller层代码

    /**
     * 输入验证码,验证登录
     *
     * @param email
     * @param code
     * @return
     */
    @PostMapping("checkCode")
    @ResponseBody
    public AjaxResult checkCode(HttpServletRequest request, String email, String code) {
        String s = jedis.get(email);
        Admin admin = adminService.findAdminByEmail(email);
        if (code.equalsIgnoreCase(s)) {
            //登录成功后,手动删除
            jedis.del(email);
            //把用户信息保存到session中
            request.getSession().setAttribute("admin",admin);
            return AjaxResult.success(admin);
        } else {
            return AjaxResult.error(AjaxStatus.CODE_CHECK_ERROR);
        }
    }

 

2、创建拦截器,检测session中的数据

public class LonginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Object admin = request.getSession().getAttribute("admin");
        if (admin==null) {
            throw new NotLoginException(AjaxStatus.NOT_LOGIN);
        }

        return true;
    }
}

 

3、在springmvc配置拦截器

<!--    拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/dist/**"/>
            <mvc:exclude-mapping path="/plugins/**"/>
            <mvc:exclude-mapping path="/login.html"/>
            <mvc:exclude-mapping path="/WEB-INF/pages/**"/>
            <mvc:exclude-mapping path="/WEB-INF/template/**"/>
            <mvc:exclude-mapping path="/getCode"/>
            <mvc:exclude-mapping path="/toCode"/>
            <mvc:exclude-mapping path="/checkCode"/>
            <mvc:exclude-mapping path="/toMain"/>
            <mvc:exclude-mapping path="/sendActiveEmail"/>
            <mvc:exclude-mapping path="/*/doActive"/>
            <mvc:exclude-mapping path="/success"/>
            <mvc:exclude-mapping path="/"/>
            <bean class="top.ftime.wk.interceptor.LonginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

 

4、设置没有登录的状态码

public enum AjaxStatus {
    /**
     * 状态码
     */
    OK(2000,"操作成功"),
    ERROR(5000,"操作失败"),
    //登录相关状态码
    EMAIL_NOT_FOUND(3000,"邮箱错误"),
    ADMIN_NOT_ACTIVE(3001,"用户未激活"),
    CODE_CHECK_ERROR(3002,"验证码错误"),
    ACTIVE_ERROR(3003,"邮箱激活失败或已激活"),
    ACTIVE_OK(2001,"激活邮件已发送,注意查收"),
    NOT_LOGIN(4004,"登录过期,请重新登录"),
    ;

    private int status;

    private String message;

    AjaxStatus(int status, String message) {
        this.status = status;
        this.message = message;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

 

5、使用自定义异常

public class NotLoginException extends RuntimeException{

    private AjaxStatus ajaxStatus;

    public AjaxStatus getAjaxStatus() {
        return ajaxStatus;
    }

    public void setAjaxStatus(AjaxStatus ajaxStatus) {
        this.ajaxStatus = ajaxStatus;
    }

    public NotLoginException(AjaxStatus ajaxStatus) {
        this.ajaxStatus = ajaxStatus;
    }
}

 

6、捕捉异常,返回给页面一个状态码

@ControllerAdvice
public class MyHandler {

    @ExceptionHandler(NotLoginException.class)
    @ResponseBody
    public AjaxResult myHandler(NotLoginException e){
        return AjaxResult.error(e.getAjaxStatus());
    }
}

 

7、设置全局函数,检测状态码

$(function () {
//全局函数
    $.ajaxSetup({
        global: true,
        complete: function (a, b, c) {
            console.log(a.responseJSON.status)
            if (a.responseJSON.status == 4004) {
                alert(a.responseJSON.message);
                parent.location.replace("/");
            }
        }
    })
}

 

posted @ 2021-06-13 23:12  mini9264  阅读(281)  评论(0)    收藏  举报