Springboot先後端分離中,後端攔截器攔截後,前端沒有對應的返回碼能夠判斷

項目登陸流程以下

       用戶進入前端登陸界面,輸入帳號密碼等,輸入完成以後前端發送請求到後端(攔截器不會攔截登陸請求),後端驗證帳號密碼等成功以後生成Token並存儲到數據庫,數據庫中包含該Token過時時間,而後返回生成的Token到前端。html

       前端收到Token,表示登陸成功,把這個Token存儲到瀏覽器Cookie中。而後跳轉到用戶中心頁面,用戶中心頁面從瀏覽器Cookie中扣出Token,跟隨請求用戶數據接口一塊兒帶到後端。前端

       後端經過攔截器攔截到這個請求,去判斷這個Token是否有效,有效就放過去作他該作的事情,無效就拋出異常。java

跨域配置

先說一下這個先後分離的項目,已經配置過跨域這些問題。我這裏後端配置的方式以下:ajax

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {    
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
                .maxAge(3600)
                .allowCredentials(true);
    }
}

前端每次發送請求也都有在ajax裏面設置xhrFields:{withCredentials: true}屬性。數據庫

攔截器代碼

@Component
public class LoginInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //從header中獲取token
        String token = request.getHeader("token");
        //token爲空
        if(StringUtils.isBlank(token)){
            throw new XjxccException("登陸信息不存在,請從新登陸", 601);
        }

        //查詢token信息
        TbUserToken tbToken = tokenService.queryByToken(token);
        if(tbToken == null || tbToken.getExpireTime().getTime() < System.currentTimeMillis()){
            throw new XjxccException("登陸信息已失效,請從新登陸", 602);
        }

        return true;
    }
}

問題

如今的狀況是,若是Token正常就沒問題,若是Token失效了,前端發送的請求就會提示跨域問題,但是該項目已經配置過跨域問題了。既然又提示跨域問題,那咱們修改代碼以下:json

@Component
public class LoginInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //從header中獲取token
        String token = request.getHeader("token");
        //token爲空
        if(StringUtils.isBlank(token)){
            setCorsMappings(request, response);
            throw new XjxccException("登陸信息不存在,請從新登陸", 601);
        }

        //查詢token信息
        TbUserToken tbToken = tokenService.queryByToken(token);
        if(tbToken == null || tbToken.getExpireTime().getTime() < System.currentTimeMillis()){
            setCorsMappings(request, response);
            throw new XjxccException("登陸信息已失效,請從新登陸", 602);
        }

        return true;
    }

    private void setCorsMappings(HttpServletRequest request, HttpServletResponse response){
        String origin = request.getHeader("Origin");
        response.setHeader("Access-Control-Allow-Origin", origin);
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization");
        response.setHeader("Access-Control-Allow-Credentials", "true");
    }
}

 這樣修改以後,若是Token無效,前端發送的請求就不會提示跨域問題。並且也能夠在ajax的success方法中根據錯誤碼(601/602)作不一樣的判斷,代碼以下:後端

$.ajax({
    type: "POST",
    url: "請求用戶信息接口",
    xhrFields:{withCredentials: true},
    headers: {token: vm.token},
    contentType: 'application/json',  
    success: function(result){
                //若是是token無效
        if(result.code == 601 || result.code == 602){
            layer.msg(result.msg + "<br>稍後爲您自動跳轉到登陸頁面");
            window.setInterval(function (){
                window.location.href = "user-login.html";
            },1500);
        }else if(判斷用戶信息接口返回的code){
                    ...
                }
    },error: function(){
        layer.msg("系統異常");
    }
});

下面附上上面代碼中的XjxccException類:跨域

/**
 * <p>Title: XjxccException.java</p>  
 * <p>Description: 自定義異常</p>  
 * <p>Copyright: Copyright (c) 2018</p>
 *  
 * @email lgqxjxcc@163.com 
 * @author liguoqing  
 * @date 2018年10月21日  
 * @version 1.0
 */
public class XjxccException extends RuntimeException {
    private static final long serialVersionUID = 1L;
    
    private String msg;
    private int code = 500;
    
    public XjxccException(String msg) {
        super(msg);
        this.msg = msg;
    }
    public XjxccException(String msg, Throwable e) {
        super(msg, e);
        this.msg = msg;
    }
    public XjxccException(String msg, int code) {
        super(msg);
        this.msg = msg;
        this.code = code;
    }
    public XjxccException(String msg, int code, Throwable e) {
        super(msg, e);
        this.code = code;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public int getCode() {
        return code;
    }
    public void setCode(int code) {
        this.code = code;
    }
}

 

相關文章
相關標籤/搜索