我正在使用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();