SpringBoot Shiroログイン成功後jsonデータに戻るshiro ajaxでログイン


古いルールで、まずコードをつけます.
protected boolean onLoginSuccess(AuthenticationToken token, Subject subject,
                                  ServletRequest request, ServletResponse response) throws Exception {
       //WebUtils.redirectToSavedRequest(request, response, JSON.toJSONString(ResultUtil.success()));
       // response.reset();
        response.setContentType("application/json");
        response.setCharacterEncoding("utf-8");
        response.getWriter().print(JSON.toJSONString(ResultUtil.success()));
        return false;
    }

注意:onLoginSuccessはユーザーのセッションをidはheadに書き込みset-cookieを行うが、ネットワーク上ではresponse.reset()が多く使われている.ヘッダ情報を空にすると、セッションの書き込みに失敗した後、フロントにログインできません.
 
一、ログインフィルタクラスの定義
    :SunckFormAuthenticationFilter      FormAuthenticationFilter
/**
 *      (   )
 *
 * @author LengChen
 * @version 1.0
 * @date 2020/8/18
 */
public class SunckFormAuthenticationFilter extends FormAuthenticationFilter {


    /**
     *            
     * @param request
     * @param response
     * @throws Exception
     */
    protected boolean onLoginSuccess(AuthenticationToken token, Subject subject,
                                  ServletRequest request, ServletResponse response) throws Exception {
       //WebUtils.redirectToSavedRequest(request, response, JSON.toJSONString(ResultUtil.success()));
       // response.reset();
        response.setContentType("application/json");
        response.setCharacterEncoding("utf-8");
        response.getWriter().print(JSON.toJSONString(ResultUtil.success()));
        return false;
    }

    /**
     *          
     *
     */
    protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e,
                                     ServletRequest request, ServletResponse response) {
        String className = e.getClass().getName(), message = "";
        System.out.println(className);
        if (IncorrectCredentialsException.class.getName().equals(className) || AuthenticationException.class.getName().equals(className)
                || UnknownAccountException.class.getName().equals(className)){
            if(!"-1".equals(StringUtils.isNumeric(e.getMessage()))){
                message = e.getMessage();
            }else{
                message = ResultEnum.SHIRO_ERROR_4.getStringCode();
            }
        }
        else if (StringUtils.isNotBlank(e.getMessage())) {
            message = e.getMessage();
        }
        else{
            message = ResultEnum.UNKNOWN_ERROR.getStringCode();
            e.printStackTrace(); //       
        }
        request.setAttribute(getFailureKeyAttribute(), className);
        request.setAttribute(Global.DEFAULT_MESSAGE_PARAM, message);
        return true;
    }
}

二、shiro配置登録フィルタ
shiroFilterChainDefinitions.put("/login", "authc");

//      
Map filters = shiroFilterFactoryBean.getFilters();
filters.put("authc", new SunckFormAuthenticationFilter());

注意:ここで構成した後、loginのpostログインはまずこのフィルタに入ってエラーを報告してからcontrollerを歩き続け、ログインに成功したら直接負けます.