例如系统中有些controller需要验证是否登录,有些需要验证是否有权限访问,而其他的controller是不需要进行任何验证就可以访问的,这种情况该怎么配置interceptor?
这种方式会让所有配置@Controller的访问都进入这两个拦截器,有没有什么方法能灵活的基于注解的方式指定要不要进入拦截器?
例如系统中有些controller需要验证是否登录,有些需要验证是否有权限访问,而其他的controller是不需要进行任何验证就可以访问的,这种情况该怎么配置interceptor?
这种方式会让所有配置@Controller的访问都进入这两个拦截器,有没有什么方法能灵活的基于注解的方式指定要不要进入拦截器?
你可以在Controller里面加上字段 private boolean needVerifyLogin;
然后在对应的拦截器里面判断是否有这个字段 例如:
[code="java"]
public class LoginRequiredInterceptorextends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
Class clazz = handler.getClass();
Field field = clazz.getDeclaredField("needVerifyLogin");
if (field != null) {
field.setAccessible(true);
if (field.getBoolean(handler)) {
if (request.getSession(false) == null) {
// 没有登录
return false;
}
}
}
return super.preHandle(request, response, handler);
}
}
[/code]
你也可以按zouruixin 说的写个注解, 比如
[code="java"]
@Target(ElementType.TYPE)
public @interface Intercept {
String[] value() default {};
}
Controller里面这样用:
@Controller
@RequestMapping("/email_account.do")
@Intercept({"com.ykxd.web.system.SystemFrontIntercepter"}) // 可以配多个
public class EmailAccountController {
[/code]
然后重写DispatcherServlet的doDispatch
在这边判断:
[code="java"]
HandlerInterceptor[] interceptors = mappedHandler.getInterceptors();
if (interceptors != null) {
for (int i = 0; i < interceptors.length; i++) {
HandlerInterceptor interceptor = interceptors[i];
if (!interceptor.preHandle(processedRequest, response, mappedHandler.getHandler())) {
triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, null);
return;
}
interceptorIndex = i;
}
}
[/code]
具体配了哪个就拦截哪个