【发布时间】:2018-03-01 07:16:37
【问题描述】:
我对 Spring mvc 很陌生,我必须开发一个基于会话跟踪的 Web 应用程序,并且我的应用程序是基于注释的。在我的网络应用程序中,我根据会话中存在的用户名和角色路由每个页面。最初我一直使用 HttpSession 作为控制器方法的参数,但是很难检查每个请求。我知道 spring 中有很多应用程序级别的安全方式,但我真的不明白如何使用它们。请建议我一些解决方案,提前感谢所有帮助。
使用拦截器更新后:
Controller class
// Method to showLogin page to user
@RequestMapping(value = "user")
public ModelAndView showLoginToUser(@ModelAttribute("VMFE") VmFeUser VMFE,HttpSession session) {
System.out.println("@C====>showLoginToUser()===> ");
ModelAndView view = new ModelAndView();
//session.setAttribute("user_name", "no_user");
try {
view.setViewName("login");
} catch (Exception e) {
e.printStackTrace();
}
return view;
}
Interceptor
public class HelloWorldInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle (HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
RequestMapping rm = ((HandlerMethod) handler).getMethodAnnotation(
RequestMapping.class);
boolean alreadyLoggedIn = request.getSession()
.getAttribute("user_name") != null;
boolean loginPageRequested = rm != null && rm.value().length > 0
&& "login".equals(rm.value()[0]);
if (alreadyLoggedIn && loginPageRequested) {
//response.sendRedirect(request.getContextPath() + "/app/main-age");
return false;
} else if (!alreadyLoggedIn && !loginPageRequested) {
System.out.println("REDIRECTING===");
response.sendRedirect(request.getContextPath() + "/user");
return false;
}
return true;
}
}
【问题讨论】:
-
我不太明白您要做什么,但是您可以使用此 @Scope(value="session") 来创建一个 bean 会话范围
-
我需要检查每个请求的会话变量是否存在。
-
啊,好吧。我想到的第一件事是使用一个会话范围的 bean,它包含你需要的所有值,因为它绑定到会话,所以不需要访问 HttpSession
-
您可以为此尝试 Interceptor,在 Google 上搜索 Spring Session Interceptor,或者查看 this
-
我猜来自@ShantaramTupe 的拦截器想法正是您正在寻找的。使用拦截器,您只有一个地方可以实现检查变量是否存在的逻辑。我认为以下链接将为您指明正确的操作方向:baeldung.com/spring-model-parameters-with-handler-interceptor
标签: spring spring-mvc session