- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 Spring MVC Web 应用程序在页面顶部有一个导航菜单,其中包含指向项目列表的链接。从数据库中检索项目列表。此菜单对应用程序中的所有页面都是通用的。目前,在每个 Controller 中,我检索并存储 session 中的项目列表(如果尚未在 session 中),以便它在每个页面上都可用。它工作正常,但我觉得应该有更好的方法来做到这一点。为了避免这种冗余,我现在尝试使用 HandlerInterceptorAdapter。我能够让它工作,但并不完美。第一次加载页面时,我没有看到我在 session 中设置的对象。但是,如果我刷新页面,我会在 session 中看到该对象。
我是这样创建拦截器的:
public class MyHandlerInterceptor extends HandlerInterceptorAdapter {
private MyService myService;
//Constructor
public MyHandlerInterceptor(MyService myService) {
this.myService = myService;
}
//Overridden method
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("In posthandle...");
if (request.getSession().getAttribute("items") == null) {
request.getSession().setAttribute("items", myService.getCategories());
}
}
}
我声明拦截器:
<mvc:interceptors>
<bean class="com.gyanify.webapp.interceptors.MyHandlerInterceptor"
autowire="constructor"/>
</mvc:interceptors>
我正在检查在 jsp 呈现时是否在 session 中设置了对象:
...
Session Attributes <br/>
<%
System.out.println("Printing from the jsp...");
Enumeration keys = session.getAttributeNames();
while (keys.hasMoreElements())
{
String key = (String)keys.nextElement();
out.println(key + ": " + session.getValue(key) + "<br>");
}
%>
...
这样,当我第一次加载页面时,我会在控制台中看到以下打印内容:
...
Returning view....(this is printed from the controller)
Printing from the jsp...
In posthandle...
...
我的理解是posthandle方法是在页面渲染之前调用的。但是,根据控制台上的输出,我看到 jsp 在拦截器的 posthandle 方法之前被渲染。
谁能帮我理解为什么会这样?
最佳答案
经过进一步调查,我发现问题出在我配置 spring 上下文 xml 文件的方式上。我有两个文件 - 一个用于应用程序上下文,另一个用于 Web 上下文。最初我在应用程序上下文 xml 中定义了 component-scan 和 mv:annotation-driven 标签:
<context:component-scan base-package="com.webapp" />
<mvc:annotation-driven validator="validator"/>
并在 web 上下文 xml 中定义了我的拦截器。
在 Debug模式下,我看到拦截器在处理请求后被映射到上下文。
为了让它工作,我将应用程序上下文中的配置更改为以下内容:
<context:component-scan base-package="com.webapp">
<context:exclude-filter type="regex" expression="com\.webapp\.controllers\.*"/>
</context:component-scan>
并将以下内容添加到网络上下文 xml 中:
<context:component-scan base-package="com.webapp.controllers" />
<mvc:annotation-driven validator="validator"/>
我仍在努力理解为什么这行得通而早期的配置却行不通。
关于java - 为什么在呈现页面后调用 HandlerInterceptorAdapter postHandle 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14092552/
我创建了以下组件来将 X-Frame-Options 添加到每个响应中: @Component public class SecurityInterceptor extends HandlerInte
我的 Spring MVC Web 应用程序在页面顶部有一个导航菜单,其中包含指向项目列表的链接。从数据库中检索项目列表。此菜单对应用程序中的所有页面都是通用的。目前,在每个 Controller 中
我目前有两个处理类似功能的拦截器。我想合并这些。 一个拦截器是一个访问请求记录器,它显示登录的用户、 session ID 和请求的 URL。 另一个拦截器是进程时间记录器。 访问记录器为了记录所有必
最近我尝试在postHander 拦截器中添加一个响应头 public boolean preHandle(HttpServletRequest request, HttpServ
我有一个记录 Spring MVC 响应结果的拦截器。我的所有响应都返回具有 JSON 正文内容的 ResponseEntity 对象。 我想从 ResponseEntity 中获取响应正文和 htt
我想做的是,在处理请求后向响应添加一个新的 header 。我需要检查处理过的 HttpStatus 代码(在我的例子中是 401 unauthorized)并添加一个新的 header 。我知道 S
我的所有 Controller 都返回 JSON 响应。作为帖子处理的一部分,我如何检查 JSON 响应的内容,以及如果出现错误如何重定向。感谢您的帮助。 最佳答案 Spring中的JSON操作基于M
我有一个 Spring 拦截器,它尝试在 postHandle() 方法中添加一个 HTTP header 。 public void postHandle(HttpServletRequest re
我是一名优秀的程序员,十分优秀!