版权声明:转载请随意! https://blog.csdn.net/qq_41723615/article/details/89517085
在正常的用户登录系统环境下,都应该提供验证码功能。
将验证码程序文件拷贝进项目中。
但是在spring安全框架的设计之中没有考虑到验证码的情况。
一、自定义链处理——验证码检查
为了保证可以使用验证码(不是为验证码准备的),那么可以借用用户名密码的验证工具完成,专门提供了:
范例:定义一个可以进行验证码检查的过滤器
package jcn;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.authentication.AuthenticationServiceException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
public class ValidateLoginFilter extends UsernamePasswordAuthenticationFilter {
@Override
public Authentication attemptAuthentication(HttpServletRequest request,
HttpServletResponse response) throws AuthenticationException {
String code = request.getParameter("code");
String rand = (String) request.getSession().getAttribute("rank");
//此处指的是找到特定参数的信息,都可以在此处验证
String username = super.obtainUsername(request).trim();
String password = super.obtainPassword(request).trim();
System.out.println("【用户名】username:" + username);
System.out.println("【密 码】password:" + password);
if (code != null && rand.equalsIgnoreCase(code)) {//验证码正确
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
return super.getAuthenticationManager().authenticate(token);
}else {
//如果有需要也可以继续判断用户名和密码的情况
throw new AuthenticationServiceException("验证码不正确");
}
}
}
既然是要进行链处理操作,那么就必须考虑到登录成功与登录失败所能够带来的结果。
配置applicationContext.xml文件:
准备好登录成功或失败的跳转路径:
<!-- 配置登录成功后的页面,跳转到列表页 -->
<bean id="loginSuccess" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
<property name="defaultTargetUrl" value="/pages/back/message/message_list.action"/>
</bean>
<!-- 配置登录失败后的跳转页面 -->
<bean id="loginFailure" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
<property name="defaultFailureUrl" value="/login.jsp?error=1"/>
</bean>
更改登录验证管理器,保留登录页和登录路径。
定义一个负责所有操作的链的连接bean。
<bean id="validateFilter" class="jcn.ValidateLoginFilter">
<property name="authenticationSuccessHandler" ref="loginSuccess"/>
<property name="authenticationFailureHandler" ref="loginFailure"/>
<property name="authenticationManager" ref="authenticationManager"/>
</bean>
最终所有的错误信息都会交由login.jsp页面负责,所以在这个页面里面需要进行错误信息的输出。
验证码检查也可以通过异步验证判断是否正确。