81,095
社区成员
发帖
与我相关
我的任务
分享
public class FormTokenInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) // 这里这里这里
//handler 是我访问的目标action 我是用@Controller注解,
//这个类跟HandlerMethod啥关系也没有
//所以一直是false 啥情况
{
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
FormToken annotation = method.getAnnotation(FormToken.class);
if (annotation != null) {
boolean needSaveSession = annotation.save();
if (needSaveSession) {
request.getSession(false).setAttribute("formToken", UUID.randomUUID().toString());
}
boolean needRemoveSession = annotation.remove();
if (needRemoveSession) {
if (isRepeatSubmit(request)) {
return false;
}
request.getSession(false).removeAttribute("formToken");
}
}
return true;
} else {
return super.preHandle(request, response, handler);
}
}
private boolean isRepeatSubmit(HttpServletRequest request) {
String serverToken = (String) request.getSession(false).getAttribute("formToken");
if (serverToken == null) {
return true;
}
String clinetToken = request.getParameter("formToken");
if (clinetToken == null) {
return true;
}
if (!serverToken.equals(clinetToken)) {
return true;
}
return false;
}
}
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) // 这里这里这里
//handler 是我访问的目标action 我是用@Controller注解,
//这个类跟HandlerMethod啥关系也没有
//所以一直是false 啥情况
他这段代码的意思是 通过判断handler 是否HandlerMethod里面的一个实例如果 handler 是 HandlerMethod的一个实例,则 instanceof 运算符返回 true。如果 handler 不是指定类的一个实例,或者 handler 是 null,则返回 false。
HandlerMethod定义的就是你要验证的类或者那个类的子类 是一个class
handler 定义的是一个object对象 是你要去匹配特定类的object对象