OpenSessionInViewFilter能很方便的处置视图显示的时候Hibernate的Lazy load 问题,但受制于filter-mapping的url-pattern,如果要精细控制过滤的url,则会导致web.xml文件filter-mapping元素大增,而且url-pattern匹配模式仅限于路径匹配模式、扩展匹配模式及详细匹配模式(参考
http://foxty.iteye.com/blog/39332)。
如何更灵活的控制OpenSessionInViewFilter需要过滤的URL?
这里给出一种代价较小,但更灵活的方式:
package com.your.servlet.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.orm.hibernate3.support.OpenSessionInViewFilter;
import org.springframework.util.AntPathMatcher;
/**
*
* @author llade
* @version 1.0
* Creation date: Oct 9, 2008 10:31:32 AM
*/
public class OpenSessionInViewFilterDelegate extends OpenSessionInViewFilter {
protected String[] mappings = new String[]{};
private AntPathMatcher antPathMatcher = new AntPathMatcher();
private boolean filterURI(String uriWithoutContextPath){
for (int i = 0; i < mappings.length; i++) {
if(antPathMatcher.match(mappings[i],uriWithoutContextPath)){
if(logger.isDebugEnabled()){
logger.debug("matched,pattern:"+mappings[i]+",uri:"+uriWithoutContextPath);
}
return true;
}
}
if(logger.isDebugEnabled()){
logger.debug("not matched,uri:"+uriWithoutContextPath);
}
return false;
}
public String[] getMappings() {
return mappings;
}
public void setMappings(String[] mappings) {
this.mappings = mappings;
}
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
String uri = request.getRequestURI();
String contextPath = request.getContextPath();
String uriWithoutContextPath = uri.substring(contextPath.length());
if(this.filterURI(uriWithoutContextPath)){//符合过滤规则.则应用OpenSessionInViewFilter
super.doFilterInternal(request, response, filterChain);
}else{//不符合,则不应用
filterChain.doFilter(request, response);
}
}
@Override
public void afterPropertiesSet() throws ServletException {
for (int i = 0; i < mappings.length; i++) {
mappings[i] = mappings[i].trim();
}
super.afterPropertiesSet();
}
}
web.xml配置:
<filter>
<filter-name>openSessionInViewFilterDelegate</filter-name>
<filter-class> org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInViewFilterDelegate</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这里解释一下,org.springframework.web.filter.DelegatingFilterProxy会找到和<filter-name>名字相同的<bean>来处理符合filter-mapping的url,真正的url过滤放在了OpenSessionInViewFilterDelegate ,所以此处使用匹配所有路径。
spring配置:
<bean id="openSessionInViewFilterDelegate" class="com.your.servlet.filter.OpenSessionInViewFilterDelegate">
<property name="mappings">
<list>
<value>/viewlist/**.jsp</value>
<value>/do/**.jsp</value>
<value>/another/*/*.jsp</value>
</list>
</property>
</bean>
这里使用了ant路径方式,*匹配单层路径,**匹配任何多层路径。而且配置也没那么复杂了。
分享到:
相关推荐
Java Servlet过滤器是Java Web应用程序中的重要组件,它在请求被Servlet处理之前和响应返回给客户端之后进行拦截,可以用于实现各种功能,如字符编码转换、URL重写、权限控制等。本篇将深入讲解Java Servlet过滤器的...
- `<url-pattern>*.action</url-pattern>` 表示该过滤器将对所有以`.action`结尾的URL模式生效,即对所有的Action请求都开启Session。 3. **原理说明:** 当配置了OpenSessionInViewFilter后,每当一个新的HTTP...
关键配置点在于指定过滤器类`org.springframework.orm.hibernate3.support.OpenSessionInViewFilter`,以及通过`<url-pattern>`指定过滤器的生效范围,例如`*.html`表示所有以.html结尾的URL都会经过该过滤器的处理...
3. **Filter Mapping配置**:确定过滤器的URL匹配规则,确保OpenSessionInViewFilter和Struts2过滤器按正确顺序执行。 ```xml <filter-name>lazyLoadingFilter <url-pattern>*.action</url-pattern> ...
- 支持对特定URL模式进行过滤,提高灵活性。 - **应用场景**:在Web应用中,经常需要处理来自不同客户端的HTTP请求,而不同的客户端可能会使用不同的字符编码。为了统一处理这些问题,`CharacterEncodingFilter`...
3. **过滤器配置**:确保所有相关的过滤器都已正确配置,例如OpenSessionInViewFilter和Struts2的核心过滤器。 4. **资源文件加载**:确保Spring能够正确加载所有的资源文件,如`applicationContext*.xml`。 5. **...
- **正确配置过滤器**:确保`OpenSessionInViewFilter`过滤器正确配置并生效。 - **优化查询逻辑**:尽量避免在没有Session支持的情况下访问懒加载的属性。 #### 三、总结 SSH框架整合虽然可以带来诸多优势,但也...
- **字符集过滤器**:通过 `<filter>` 和 `<filter-mapping>` 元素配置了一个字符集过滤器 `EnconfigFilter`,该过滤器用于设置请求的编码格式为 GBK,作用于所有的 URL 请求路径。 - **Hibernate 会话管理**:同样...
4. 添加Struts2的过滤器,拦截URL请求并路由到相应的Action: ```xml <filter-name>struts2 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter <filter-name>struts2...
- **映射动态配置**:使用通配符(*)和占位符({})来定义请求映射规则,使得Struts2能够更加灵活地处理各种URL请求。 **4. 传值的获取表达式** - **EL表达式**:用于存取数据,支持`.`和`[]`两种运算符。当属性名...
- **解决方案**:使用 OpenSessionInViewFilter 过滤器,在请求开始时打开 Session,并在请求结束时关闭 Session。 2. **DAO层**:使用 Hibernate 来实现数据访问操作。 3. **业务层**:利用 Spring 的依赖注入和...
为了解决这个问题,可以使用`OpenSessionInViewFilter`过滤器。这个过滤器的作用是在Web请求开始时开启一个新的Hibernate Session,然后在请求结束时关闭Session,确保在整个请求处理过程中,Session都是打开的,...