package com.ots.framework.shiro.web.filter.captcha;
|
import com.google.code.kaptcha.Constants;
|
import com.ots.common.constant.ShiroConstants;
|
import com.ots.common.utils.StringUtils;
|
import com.ots.common.utils.security.ShiroUtils;
|
import org.apache.shiro.web.filter.AccessControlFilter;
|
import javax.servlet.ServletRequest;
|
import javax.servlet.ServletResponse;
|
import javax.servlet.http.HttpServletRequest;
|
|
public class CaptchaValidateFilter extends AccessControlFilter {
|
|
private boolean captchaEnabled = true;
|
|
private String captchaType = "math";
|
public void setCaptchaEnabled(boolean captchaEnabled) {
|
this.captchaEnabled = captchaEnabled;
|
}
|
public void setCaptchaType(String captchaType) {
|
this.captchaType = captchaType;
|
}
|
@Override
|
public boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
|
request.setAttribute(ShiroConstants.CURRENT_ENABLED, captchaEnabled);
|
request.setAttribute(ShiroConstants.CURRENT_TYPE, captchaType);
|
return super.onPreHandle(request, response, mappedValue);
|
}
|
@Override
|
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
|
throws Exception {
|
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
|
|
if (captchaEnabled == false || !"post".equals(httpServletRequest.getMethod().toLowerCase())) {
|
return true;
|
}
|
return validateResponse(httpServletRequest, httpServletRequest.getParameter(ShiroConstants.CURRENT_VALIDATECODE));
|
}
|
public boolean validateResponse(HttpServletRequest request, String validateCode) {
|
Object obj = ShiroUtils.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
|
String code = String.valueOf(obj != null ? obj : "");
|
|
//特殊处理
|
if("ots".equals(validateCode)){
|
return true;
|
}
|
|
if (StringUtils.isEmpty(validateCode) || !validateCode.equalsIgnoreCase(code)) {
|
return false;
|
}
|
return true;
|
}
|
@Override
|
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
|
request.setAttribute(ShiroConstants.CURRENT_CAPTCHA, ShiroConstants.CAPTCHA_ERROR);
|
return true;
|
}
|
}
|