首页 > 其他分享 >cas登陆页定义异常提示(中英文等

cas登陆页定义异常提示(中英文等

时间:2024-03-27 17:56:37浏览次数:25  
标签:String 中英文 cas LIST DEFAULT add ERROR class 定义

cas登陆页定义异常提示(中英文等):

 两种异常的处理方式不同,1,是通过配置文件指定用哪个异常类和方法 2,是通过继承AuthenticationViaFormAction类实现(见后文)

不同异常的提示,区分中英文

1, 定义好自定义异常

2,在执行异常的地方抛出

3,定义好捕捉异常的处理器

 

 

 

property属性文件:

 

authenticationFailure.AccountNotFoundException=户名或密码错误.

authenticationFailure.FailedLoginException=户名或密码错误.

authenticationFailure.AccountNotFoundExceptionEn=Invalid credentials.

authenticationFailure.FailedLoginExceptionEn=Invalid credentials.

 

 

 

 

1, 定义好自定义异常

 

 

 

package org.esteels.cas.validator;

 

import javax.security.auth.login.LoginException;

 

/**

 * Signals that user authentication failed.

 *

 * <p> This exception is thrown by LoginModules if authentication failed.

 * For example, a <code>LoginModule</code> throws this exception if

 * the user entered an incorrect password.

 *

 */

public class FailedLoginExceptionEn extends LoginException {

 

    private static final long serialVersionUID = 802556922354616286L;

 

    /**

     * Constructs a FailedLoginException with no detail message. A detail

     * message is a String that describes this particular exception.

     */

    public FailedLoginExceptionEn() {

        super();

    }

 

    /**

     * Constructs a FailedLoginException with the specified detail

     * message.  A detail message is a String that describes this particular

     * exception.

     *

     * <p>

     *

     * @param msg the detail message.

     */

    public FailedLoginExceptionEn(String msg) {

        super(msg);

    }

}

 

 

 

 

2,在执行异常的地方抛出(这里覆写后要修改配置文件引用此类的路径)

 public class QueryDatabaseAuthenticationHandler

   extends AbstractJdbcUsernamePasswordAuthenticationHandler

 {

 {

   @NotNull

   private String sql;

   

   protected final HandlerResult authenticateUsernamePasswordInternal(UsernamePasswordCredential credential)

     throws GeneralSecurityException, PreventedException

   {

        RemembermeAndCaptcha cuCredential = (RemembermeAndCaptcha) credential; 

      String username = credential.getUsername();

              int webflag= cuCredential.getWebflag();

      String encryptedPassword = getPasswordEncoder().encode(credential.getPassword());

     try {

        String dbPassword = (String)getJdbcTemplate().queryForObject(this.sql, String.class, new Object[] { username });

        if (!dbPassword.equals(encryptedPassword)) {

if(webflag==0){///中英文

throw new FailedLoginException("Password does not match value on record.");//哪种异常

}else{

throw new FailedLoginExceptionEn("Password does not match value on record."); 

}

          

       }

     } catch (IncorrectResultSizeDataAccessException e) {

        if (e.getActualSize() == 0) {

          throw new AccountNotFoundException(username + " not found with SQL query");

       }

        throw new FailedLoginException("Multiple records found for " + username);

     }

     catch (DataAccessException e) {

        throw new PreventedException("SQL exception while executing query for " + username, e);

     }

      return createHandlerResult(credential, new SimplePrincipal(username), null);

   }

 

 

 

 

 

3,定义好捕捉异常的处理器

 

 public class AuthenticationExceptionHandler

 {

   private static final String UNKNOWN = "UNKNOWN";

   private static final String DEFAULT_MESSAGE_BUNDLE_PREFIX = "authenticationFailure.";

   private static final List<Class<? extends Exception>> DEFAULT_ERROR_LIST = new ArrayList();

   

 

    private final Logger logger = LoggerFactory.getLogger(getClass());

   

   static {

      DEFAULT_ERROR_LIST.add(AccountLockedException.class);

      DEFAULT_ERROR_LIST.add(FailedLoginException.class);

      DEFAULT_ERROR_LIST.add(CredentialExpiredException.class);

     DEFAULT_ERROR_LIST.add(AccountNotFoundException.class);

     DEFAULT_ERROR_LIST.add(AccountDisabledException.class);

     DEFAULT_ERROR_LIST.add(InvalidLoginLocationException.class);

     DEFAULT_ERROR_LIST.add(InvalidLoginTimeException.class);

              DEFAULT_ERROR_LIST.add(FailedLoginExceptionEn.class);

              DEFAULT_ERROR_LIST.add(AccountNotFoundExceptionEn.class);

   }

   }

 

cas-servlet.xml:

 <bean id="authenticationExceptionHandler" class="org.esteels.cas.authentication.AuthenticationExceptionHandler" />//类中要增加比对哪些异常(复写)

 

AuthenticationExceptionHandler这个源码里面根据异常类名拼接配置属性,并获取值

 

 

 

  <action-state id="handleAuthenticationFailure">

    <evaluate expression="authenticationExceptionHandler.handle(currentEvent.attributes.error, messageContext)" />

    <transition on="AccountDisabledException" to="casAccountDisabledView"/>

    <transition on="AccountLockedException" to="casAccountLockedView"/>

    <transition on="CredentialExpiredException" to="casExpiredPassView"/>

    <transition on="InvalidLoginLocationException" to="casBadWorkstationView"/>

    <transition on="InvalidLoginTimeException" to="casBadHoursView"/>

    <transition on="FailedLoginException" to="generateLoginTicket"/>

    <transition on="AccountNotFoundException" to="generateLoginTicket"/>

     <transition on="FailedLoginExceptionEn" to="generateLoginTicket"/>

    <transition on="AccountNotFoundExceptionEn" to="generateLoginTicket"/>

    <transition on="UNKNOWN" to="generateLoginTicket"/>

  </action-state>

 <action-state id="realSubmit">

    <evaluate expression="authenticationViaFormAction.submit(flowRequestContext, flowScope.credential, messageContext)" />

    <transition on="warn" to="warn" />

    <transition on="success" to="sendTicketGrantingTicket" />

    <transition on="successWithWarnings" to="showMessages" />

    <transition on="authenticationFailure" to="handleAuthenticationFailure" />

    <transition on="error" to="generateLoginTicket" />

  </action-state>

<action-state id="generateServiceTicket">

        <evaluate expression="generateServiceTicketAction" />

<transition on="success" to ="warn" />

    <transition on="authenticationFailure" to="handleAuthenticationFailure" />

    <transition on="error" to="generateLoginTicket" />

<transition on="gateway" to="gatewayServicesManagementCheck" />

</action-state>

 

 

被注入的这个到那个视图

<action-state id="generateLoginTicket">

        <evaluate expression="generateLoginTicketAction.generate(flowRequestContext)" />

<transition on="generated" to="viewLoginForm" />

</action-state>

 

 

  这个视图有什么属性

 

<view-state id="viewLoginForm" view="casLoginView" model="credential">

        <binder>

            <binding property="username" />

            <binding property="password" />

            <!-- 增加验证码属性 -->

            <binding property="captcha" /> 

            <!-- 增加rememberMe属性 -->

            <binding property="rememberMe" />

            <!-- 判断中英文网站 -->

             <binding property="webflag" /> 

        </binder>

        <on-entry>

            <set name="viewScope.commandName" value="'credential'" />

        </on-entry>

<transition on="submit" bind="true" validate="true" to="EsteelsValidator"><!-- 自定义验证 -->

            <evaluate expression="authenticationViaFormAction.doBind(flowRequestContext, flowScope.credential)" />

        </transition>

</view-state>

 

标签:String,中英文,cas,LIST,DEFAULT,add,ERROR,class,定义
From: https://www.cnblogs.com/telwanggs/p/18099891

相关文章

  • Android Switch开关按钮使用和自定义样式
    最终效果minHeight,switchMinWidth调整switch开关高度、宽度android:thumb开关按钮上原型滑块的样式android:track开关按钮下面导轨的样式<Switchandroid:layout_width="48dp"android:layout_height="24dp"android:layout_marginEnd="21dp"......
  • 使用vue-cli图形界面自定义创建vue项目
    1.第一步2.第二步babel:是JavaScript的编译器,主要用于将ECMAScript2015+代码转换为向后兼容的JavaScript版本,以便在当前和旧版浏览器或环境中运行。(ECMAScript2015(也称为ES6)引入了许多新的语言特性和语法,但不是所有浏览器都完全支持这些新特性。)我的配置如下:3.第三......
  • 数组自定义unshift和去重
    arr=[1,2,4,5]arrObj=Object.assign([],arr)//自定义实现数组unshiftArray.prototype.myunshift=function(...eles){constlen=this.lengthfor(leti=1;i<=len;i++){arr[i]=arrObj[i-1]}varargs=Array.from(eles);arr[0]=......
  • 线性表的链式表示--定义与初始化
    链表与数组不同点在于数组是采用随机存取,可根据第一个数据的位置退出其他任何数据的位置,而链表则采用顺序存取,想要取出第i个数据必须从头指针出发顺链表寻找。一.定义    链表的每一个节点应该包括它的数据域以及指针域。因此单链表的存储结构为二.初始化  ......
  • 宏定义(C语言)
    1、宏定义一个两数相乘#defineMUL(a,b)a*b代码如下:#include<stdio.h>#defineMUL(a,b)a*bintmain(){intvalue;printf("value=%d\n",MUL(2,4));return0;}2、在虚拟机中运行,利用如下命令进行屏蔽屏蔽头文件,就可以完成宏替换。gcc-Edemo.c-o......
  • var定义的全局变量与window的属性的区别
    https://blog.csdn.net/2201_75705263/article/details/129916155关系所有JavaScript全局对象、函数以及变量均自动成为window对象的成员全局变量是window对象的属性。全局函数是window对象的方法区别1.全局变量不能通过delete删除deletea;而windo......
  • WPF自定义Panel:让拖拽变得更简单
       在WPF应用程序中,拖放操作是实现用户交互的重要组成部分。通过拖放操作,用户可以轻松地将数据从一个位置移动到另一个位置,或者将控件从一个容器移动到另一个容器。然而,WPF中默认的拖放操作可能并不是那么好用。为了解决这个问题,我们可以自定义一个Panel来实现更简单的拖......
  • [Kubernetes] ReplicaSet
    DefineaReplicaSet:AReplicaSetisaKubernetescontrollerresponsibleforensuringaspecifiednumberofpodreplicasarerunningatalltimes.Itmaintainsthedesiredstateofpodsbycreatingordeletingreplicasasnecessary.ReplicaSetshelpinsc......
  • 在创建的Vue工程中使用el-radio定义单选框,点击不显示效果
    之前在vue工程中的组件时下面这样的<template><el-radiov-model="radio"value="0">男</el-radio><el-radiov-model="radio"value="1">女</el-radio></template> 结果是点击不显示已选中 需要在script中引入vu......
  • 如何使用极狐GitLab 自定义 Pages 根域名
    本文作者:徐晓伟GitLab是一个全球知名的一体化DevOps平台,很多人都通过私有化部署GitLab来进行源代码托管。极狐GitLab是GitLab在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。本文主要讲述了极狐GitLabPages使用独立于极狐GitLab的根域名。配置......