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

时间:2016-01-07 11:09:25

标签: java spring hibernate tomcat

我正在使用spring 4.x和hibernate 4.x开发基于java 1.7和tomcat 7的新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;
   }
}

我不确定这种“技术”是否合适,我最担心的是,如果我有2个或更多同时请求,则控制器和拦截器正常工作。

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

菲尔

1 个答案:

答案 0 :(得分:0)

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

相关问题