cas添加验证码

 

cas添加验证码,折腾了很久,终于整理好了,很大部分都是借鉴http://binghejinjun.iteye.com/blog/1255293这个的。可是他的有一个很很差的地方就是不能提高验证码错误!css

红色字体的为我添加的,能够提示验证码错误!很简单,感谢。原做者。谢谢。html

 

1.   首先,我用的cas版本是3.4.6,验证码采用的是CAPTCHA,所需jar包能够google搜索,部署好cas后.在web-info目录下找到login-webflow.xml,打开,找到以下代码: java

<view-state id="viewLoginForm" view="casLoginView" model="credentials"> web

        <var name="credentials" class="org.jasig.cas.authentication.principal.UsernamePasswordCredentials" /> spring

        <binder> express

            <binding property="username" /> session

            <binding property="password" /> app

        </binder> jsp

        <on-entry> 字体

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

        </on-entry>

<transition on="submit" bind="true" validate="true" to="realSubmit">

            <set name="flowScope.credentials" value="credentials" />

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

        </transition>

</view-state>

  此段代码的功能是绑定cas登陆过程当中的用户名和密码,再次咱们修改以下: 

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

        <var name="credentials" class="org.jasig.cas.authentication.principal.UsernamePasswordCredentials" />

        <binder>

            <binding property="username" />

            <binding property="password" />

        </binder>

        <on-entry>

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

        </on-entry>

<transition on="submit" bind="true" validate="true" to="yzmSubmit">

            <set name="flowScope.credentials" value="credentials" />

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

        </transition>

</view-state>

  也就是说,只须要修改realSubmit为yzmSubmit便可.而后加入以下配置: 

复制代码

<!--fan add start--> 
<action-state id="yzmSubmit"> 
        <evaluate expression="yzmViaFormAction.submit(flowRequestContext,messageContext)" /> 
<transition on="success" to="realSubmit" /> 
<transition on="error" to="viewLoginForm" /> 
</action-state> 
<!--fan add end-->

复制代码

此段配置是自定义的验证码验证器,用来验证你提交的验证码的正确性. 
  2.在web-info下找到cas-servlet.xml,打开后,加入 

<!--fan add start-->

<bean id="yzmViaFormAction" class="com.ivan.zhang.servlet.YzmAction"

/>

  <!--fan add end-->此配置是注册自定义的验证码 
  3.编写以下类: 

package com.ivan.zhang.servlet;

 

import com.ivan.zhang.CaptchaServiceSingleton;

import com.octo.captcha.service.image.ImageCaptchaService;

import java.io.PrintStream;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpSession;

import org.jasig.cas.web.support.WebUtils;

import org.springframework.webflow.core.collection.ParameterMap;

import org.springframework.webflow.execution.RequestContext;

 

public class YzmAction

{

  public final String submit(RequestContext context)

    throws Exception

  {

    Boolean flag = Boolean.valueOf(false);

    System.out.println("YzmAction is submiting....................");

    String yzm = context.getRequestParameters().get("yzm");

    String captchaId = WebUtils.getHttpServletRequest(context).getSession().getId();

    flag = CaptchaServiceSingleton.getInstance().validateResponseForID(captchaId,

      yzm);

    if (flag.booleanValue()) {

      return "success";

    } <br>//<span style="background-color: #ff0000;">我添加的改动。提示验证码错误</span>

MessageBuilder msgBuilder = new MessageBuilder();
msgBuilder.defaultText("验证码错误!");
messageContext.addMessage(msgBuilder.error().build());

    return "error";

  }

}

  其中,flag = CaptchaServiceSingleton.getInstance().validateResponseForID(captchaId, 
      yzm); 
此句话是为了验证提交的验证码和先前生成的验证码的正确性,以此做为验证结果跳转的依据.CaptchaServiceSingleton此类是自定义类,稍后会附加完整的类供下载调试. 
4.打开web-info/view/jsp/default/ui/casLoginView.jsp,在密码下面加入

<%--fan add start --%>

<img alt="yzm" src="captcha.jpg">

<spring:message code="screen.welcome.label.yzm.accesskey" var="yzmAccessKey" />

<form:input cssClass="required" cssErrorClass="error" id="yzm" size="25" tabindex="1" accesskey="${yzmAccessKey}" path="yzm" autocomplete="false" htmlEscape="true" />

<%--fan add end --%>

  5. 最后一步则是注册验证码生成器,打开web.xml文件,加入 

<servlet> 

        <servlet-name>jcaptcha</servlet-name> 

        <servlet-class>com.ivan.zhang.servlet.ImageCaptchaServlet</servlet-class

        <load-on-startup>0</load-on-startup> 

    </servlet>

<servlet-mapping> 

        <servlet-name>jcaptcha</servlet-name> 

        <url-pattern>/captcha.jpg</url-pattern> 

    </servlet-mapping>

  ok,就这么简单.简单解释一下流程,web.xml中注册的类是用来调用自定义的验证码生成器,以便在显示登录界面的时候绘制验证码图片,并在session中生成标志位并记录,当用户提交验证码和用户名密码时,会先走自定义的验证码验证器(此时会先验证验证码的正确性),若是正确,再走用户名和密码的验证,若是不正确,则直接跳转回登录页面.yzm.jar是自定义的验证码生成器和验证类,直接打包好后放到web-info/lib下. 

 

努力生活,珍惜一切,满足最快乐!young joy..

相关文章
相关标签/搜索