`

让OpenSessionInViewFilter更灵活的过滤URL

阅读更多
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路径方式,*匹配单层路径,**匹配任何多层路径。而且配置也没那么复杂了。
3
0
分享到:
评论
1 楼 freeroy 2012-05-18  
呃~既然都是spring环境,可不直接使用DelegatingFilterProxy呢~用Ant表达式就OK了

相关推荐

    Java servlet过滤器配置详解

    Java Servlet过滤器是Java Web应用程序中的重要组件,它在请求被Servlet处理之前和响应返回给客户端之后进行拦截,可以用于实现各种功能,如字符编码转换、URL重写、权限控制等。本篇将深入讲解Java Servlet过滤器的...

    懒加载异常解决.docx

    - `&lt;url-pattern&gt;*.action&lt;/url-pattern&gt;` 表示该过滤器将对所有以`.action`结尾的URL模式生效,即对所有的Action请求都开启Session。 3. **原理说明:** 当配置了OpenSessionInViewFilter后,每当一个新的HTTP...

    spring监听器

    关键配置点在于指定过滤器类`org.springframework.orm.hibernate3.support.OpenSessionInViewFilter`,以及通过`&lt;url-pattern&gt;`指定过滤器的生效范围,例如`*.html`表示所有以.html结尾的URL都会经过该过滤器的处理...

    ssh配置总结

    3. **Filter Mapping配置**:确定过滤器的URL匹配规则,确保OpenSessionInViewFilter和Struts2过滤器按正确顺序执行。 ```xml &lt;filter-name&gt;lazyLoadingFilter &lt;url-pattern&gt;*.action&lt;/url-pattern&gt; ...

    SSH框架整合所需类class.txt

    - 支持对特定URL模式进行过滤,提高灵活性。 - **应用场景**:在Web应用中,经常需要处理来自不同客户端的HTTP请求,而不同的客户端可能会使用不同的字符编码。为了统一处理这些问题,`CharacterEncodingFilter`...

    struts2 spring hibernate整合要点、注意点

    3. **过滤器配置**:确保所有相关的过滤器都已正确配置,例如OpenSessionInViewFilter和Struts2的核心过滤器。 4. **资源文件加载**:确保Spring能够正确加载所有的资源文件,如`applicationContext*.xml`。 5. **...

    三大框架整合常见问题

    - **正确配置过滤器**:确保`OpenSessionInViewFilter`过滤器正确配置并生效。 - **优化查询逻辑**:尽量避免在没有Session支持的情况下访问懒加载的属性。 #### 三、总结 SSH框架整合虽然可以带来诸多优势,但也...

    spring+struts+hibernate的配置文档

    - **字符集过滤器**:通过 `&lt;filter&gt;` 和 `&lt;filter-mapping&gt;` 元素配置了一个字符集过滤器 `EnconfigFilter`,该过滤器用于设置请求的编码格式为 GBK,作用于所有的 URL 请求路径。 - **Hibernate 会话管理**:同样...

    ssh+mysql整合[参考].pdf

    4. 添加Struts2的过滤器,拦截URL请求并路由到相应的Action: ```xml &lt;filter-name&gt;struts2 &lt;filter-class&gt;org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter &lt;filter-name&gt;struts2...

    spring框架登录初始化数据与struct2权限设置等相关知识

    - **映射动态配置**:使用通配符(*)和占位符({})来定义请求映射规则,使得Struts2能够更加灵活地处理各种URL请求。 **4. 传值的获取表达式** - **EL表达式**:用于存取数据,支持`.`和`[]`两种运算符。当属性名...

    spring学习笔记

    - **解决方案**:使用 OpenSessionInViewFilter 过滤器,在请求开始时打开 Session,并在请求结束时关闭 Session。 2. **DAO层**:使用 Hibernate 来实现数据访问操作。 3. **业务层**:利用 Spring 的依赖注入和...

    Spring与Web整合实例

    为了解决这个问题,可以使用`OpenSessionInViewFilter`过滤器。这个过滤器的作用是在Web请求开始时开启一个新的Hibernate Session,然后在请求结束时关闭Session,确保在整个请求处理过程中,Session都是打开的,...

Global site tag (gtag.js) - Google Analytics