Java Web应用程序、控制器和拦截器的正确性



我正在使用spring4.x和hibernate 4.x开发一个基于java1.7和tomcat7的新web应用程序。我想确认一下控制器的正确性,因为在每次请求中,我都需要检查一些条件和我不知道我所执行的是否安全。这是我的基本控制器:

public abstract class BaseController<BEAN extends BaseBean> implements Serializable
{
   ..........
   public void setRequest(HttpServletRequest request) {
       this.request = request;
   }
   public void setResponse(HttpServletResponse response) {
       this.response = response;
   }
   protected final BEAN getBean(boolean createIfNull)
   {
       .............
   }
   .........
 }

这是我的拦截器,它进行条件检查:

@Component
public class ControllerInterceptor extends HandlerInterceptorAdapter
{
   @Override
   public boolean preHandle(HttpServletRequest request,
                            HttpServletResponse response,
                            Object handler) throws Exception
   {
       super.preHandle(request, response, handler);
       BaseController<BaseBean> bc = getControllerInstance(handler);
       if(bc != null)
       {
           if(/*checks conditions*/)
           {
               bc.setValue1(true);
               bc.setValue2(false);
           }
           else
           {
               bc.setValue1(false);
               bc.setValue2(true);
           }
           bc.setRequest(request);
           bc.setResponse(response);
       }
       return true;
   }
   @SuppressWarnings("unchecked")
   protected BaseController<BaseBean> getControllerInstance(Object  handler) throws SecurityException, InstantiationException, IllegalAccessException
   {
       Field field;
       try 
       {
           field = handler.getClass().getDeclaredField("bean");
       } 
       catch (NoSuchFieldException e) 
       {
           return null;
       }
       field.setAccessible(true);
       Object value = field.get(handler);
       return (BaseController<BaseBean>) value;
   }
}

我不确定这种"技术"是否好,我最担心的是,如果我有两个或两个以上的同时请求,Controller和Interceptor会正常工作。

我非常感谢你的建议。提前谢谢。

Phil

更好的方法是使用ControllerAdvice。有一个名为ControllerAdviceBase的类和您的控制器,并用@ControllerAdvice&@EnableWebMvc。在类中添加一个私有的void方法,比如名称为initBinder(WebDataBinder binder, WebRequest webRequest),并用@InitBinder对其进行注释。现在,在到达控制器的操作之前,每个请求都将首先通过这个initBinder。您可以从以下方面开始使用此技术:String contextPath = ((ServletWebRequest)webRequest).getRequest().getRequestURI();

最新更新