我正在使用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个或更多同时请求,则控制器和拦截器正常工作。
我非常感谢你的建议。 提前谢谢。
菲尔
答案 0 :(得分:0)
更好的方法是使用ControllerAdvice
。将名称ControllerAdviceBase
与您的控制器一起使用,并使用@ControllerAdvice
&amp; @EnableWebMvc
。在类中添加一个私有void方法,名称为initBinder(WebDataBinder binder, WebRequest webRequest)
,并用@InitBinder
注释。现在,每个请求都会在到达您的控制器之前首先通过此initBinder。动作。您可以开始使用此技术:String contextPath = ((ServletWebRequest)webRequest).getRequest().getRequestURI();