背景:由于项目登录模块之前使用传统的字符验证码,干扰又太严重,经常会有输入十次以上才能蒙对的情况。于是提出让改为滑动验证码(斗鱼,B站等等)。如图所示:
原有的:
要改的:
这个实现都可以查的到,就不放源码了。接下来开始正题,说一下遇到的问题:
1,项目中使用到了shiro来做验证,这里有个返回前台图片的接口,需要在shiro的配置中添加上对应的url,
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<property name="unauthorizedUrl" value="/error.jsp"/>
<property name="filters">
<util:map>
<entry key="shiroAuth" value-ref="shiroAuthFilter"/>
</util:map>
</property>
<property name="filterChainDefinitions">
<value>
/index.html = anon
/user/login = anon
// 新增,获取大小图接口
/user/getVerifyImage = anon
// 新增,滑动验证接口
/user/verifyPath = anon
/user/logout = logout
/** = shiroAuth
</value>
</property>
</bean>
添加上之后,前台在没有登录的情况下,可以拿到图片。
2,该改的地方都改了,别的接口都可以访问,唯独login接口访问是200,却只返回captchaError(验证码错误!)。问题是这边的滑动验证码是验证成功的,老的验证码前台又没有调用那个接口,怎么会报这个错误,百思不得其解。恰跟烟,冷静了一下后。开始捋登录的流程,经过了拦截器,过滤器,问题应该在这里。然后开始找项目中的拦截器和过滤器,最终在web.xml中找到了这样的代码:
<filter>
<filter-name>jcaptchaFilter</filter-name>
<filter-class>com.filter.JcaptchaFilter</filter-class>
<init-param>
<param-name>jcaptchaParamName</param-name>
<param-value>captcha</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>jcaptchaFilter</filter-name>
<url-pattern>/user/login</url-pattern>
</filter-mapping>
点进去之后是这样的:
注释掉之后,成功了。