我有一个要求要完成。
实际上当用户登录我的应用程序时,我会将登录的用户名保存在会话属性中。
session.setAttribute("LOGIN_USER", userName);
因此,如果用户尝试直接访问我的方法链接而不是来自登录页面,我可以检查控制器方法是否该会话具有如下的特定属性值,我可以限制用户访问该页面并将其重定向到登录页面。
if(request.getSession(false).getAttribute("LOGIN_USER")==null)
//redirect to login page
现在,我的要求是如果我在控制器中有50个方法我不能在每个方法中添加这个条件。我认为有一种方法可以在控制器类中添加某种过滤器或任何方法,如ex @preExecuteMethod首先执行此方法并在成功时继续进行实际调用。
答案 0 :(得分:3)
答案 1 :(得分:1)
拦截器是解决方案。它有方法preHandler,它将在每个请求之前调用。您可以挂钩到每个HTTPServletRequest对象并执行不必要的操作。
这是一个示例代码:
@Component
public class AuthCodeInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// set few parameters to handle ajax request from different host
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
response.addHeader("Access-Control-Max-Age", "1000");
response.addHeader("Access-Control-Allow-Headers", "Content-Type");
response.addHeader("Cache-Control", "private");
String reqUri = request.getRequestURI();
String serviceName = reqUri.substring(reqUri.lastIndexOf("/") + 1,
reqUri.length());
if(request.getSession(false).getAttribute("LOGIN_USER")==null) {
//redirect to login page
}
return super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);
}
}
答案 2 :(得分:0)
也许你可以使用AOP @Before方面给出处理程序类中方法的切入点?请参阅参考here,或者您可以通过delegatingFilterProxy解释here创建常规过滤器。我认为整体@skaffman提出了一个更好的主意。