博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jfinal+shiro基础上添加jcaptcha验证码
阅读量:6239 次
发布时间:2019-06-22

本文共 3549 字,大约阅读时间需要 11 分钟。

hot3.png

 

上门链接是上次分享了在jfinal中添加jcaptcha验证码

后看到@的jfinal-shiro插件,顺便将验证码加入

MyShiroRealm.java

/**	 * 认证回调函数, 登录时调用.	 */	@Override	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {		//是否启用验证码		if (useCaptcha) {			CaptchaUsernamePasswordToken token = (CaptchaUsernamePasswordToken) authcToken;			String parm = token.getCaptcha();			if (StringUtils.isNotBlank(parm))				parm = parm.toUpperCase();			try {				if (!CaptchaServiceSingleton.getInstance().validateResponseForID(SecurityUtils						.getSubject().getSession().getId().toString(), parm)) {					throw new IncorrectCaptchaException("验证码错误!");				}			} catch (Exception e) {				// session如果没有刷新,validateResponseForID会抛出com.octo.captcha.service.CaptchaServiceException的异常				throw new IncorrectCaptchaException("验证码错误!");			}		} 		UsernamePasswordToken token = (UsernamePasswordToken) authcToken;		String password = String.valueOf(token.getPassword());		// 调用操作数据库的方法查询user信息		User user = User.dao.getUserByName(token.getUsername());		if (user != null) {			byte[] salt = Encodes.decodeHex(user.getStr(User.SALT));			List
 roles = Role.dao.getRoleByUser(user.getStr(User.ID)); ShiroUser shiroUser = new ShiroUser(user.getStr(User.ID), user.getStr(User.USERNAME), user,roles); Session session = SecurityUtils.getSubject().getSession(); session.setAttribute(SecurityConstants.LOGIN_USER, shiroUser); // 这里可以缓存认证 return new SimpleAuthenticationInfo(shiroUser, user.getStr(User.PASSWORD), ByteSource.Util.bytes(salt), getName()); } else { return null; } }

view-login.ftl

      
    
登录    
    
    
    
    
    
    
     
    
    
    
    
     
        $(function (){         $("#signupForm").validate({         rules: {    username: "required",    captcha_key: "required",    password: {     required: true,     minlength: 5    }   },   messages: {    username: "请输入用户名",    captcha_key: "请输入验证码",    password: {     required: "请输入密码",     minlength: jQuery.format("密码不能小于{0}个字 符")    }   }     });        });          
input.error { border: 1px solid red; } label.error {   padding-left: 16px;   padding-bottom: 2px;   font-weight: bold;   color: #EA5200; }            
  
  
  
  
   
         
    
        
CMS.

        
            
                

登录

                        
                
                
                
                
                
                 
                
               
               
                 
                
                
                    
                        <#if shiroLoginFailure?exists> <#assign error=shiroLoginFailure/>
        <#if error?exists>        
            
            
Warning!            <#if error?contains("AuthenticationException")>             请检查您输入的账户、密码、验证码是否正确. <#elseif error?contains("UnknownAccountException")>  请检查您输入的账户、密码、验证码是否正确. <#elseif error?contains("DisabledAccountException")>  未经审核的账户不允许登录. <#elseif error?contains("IncorrectCaptchaException")>   验证码错误. <#else> 登录失败,请重试.            
                
                          
  
@ControllerBind(controllerKey="/admin/validateLogin")@Before(AdminInterceptorStack.class)public class LoginController extends Controller {	private Collection
 moduleSets = new TreeSet
(); //主页 public void index() throws Exception{ String username = getPara(CaptchaFormAuthenticationFilter.DEFAULT_USERNAME_PARAM);   setAttr(CaptchaFormAuthenticationFilter.DEFAULT_USERNAME_PARAM, username);//         render(IndexController.LOGIN_PAGE);   returnTo(this,Constants.NO_LOGIN, getRequest(),getResponse()); }  private void returnTo(Controller controller,String result, HttpServletRequest request, HttpServletResponse response) throws IOException { if (AJAXResponseUtils.isAjaxRequest(request)) {  AJAXResponseUtils.response(controller,response, Constants.NO_LOGIN); }else if(Constants.NO_LOGIN.equals(result)){ controller.render(Constants.LOGIN_PAGE); }else{ controller.render(result); } }}

转载于:https://my.oschina.net/edeis2012/blog/192040

你可能感兴趣的文章
[MicroPython]TurniBit开发板DIY自动窗帘模拟系统
查看>>
从Handler.post(Runnable r)再一次梳理Android的消息机制(以及handler的内存泄露)
查看>>
windows查看端口占用
查看>>
Yii用ajax实现无刷新检索更新CListView数据
查看>>
JDBC的事务
查看>>
App 卸载记录
查看>>
JavaScript变量和作用域
查看>>
开源SIP服务器加密软件NethidPro升级
查看>>
Apache Pulsar中的地域复制,第1篇:概念和功能
查看>>
python pip install 出现 OSError: [Errno 1] Operation not permitted
查看>>
从源码分析scrollTo、scrollBy、Scroller方法的区别和作用
查看>>
ObjectOutputStream和ObjectInputStream
查看>>
南京大学周志华教授当选欧洲科学院外籍院士
查看>>
马士兵教学语录
查看>>
计算机网络与Internet应用
查看>>
oracle在线迁移同步数据,数据库报错
查看>>
linux性能剖析工具
查看>>
flutter中的异步
查看>>
计算机高手也不能编出俄罗斯方块——计算机达人成长之路(16)
查看>>
error LNK2001: 无法解析的外部符号 __CrtDbgReport
查看>>