`

自定义OpenSessionInViewer过滤器

阅读更多
摘自孔浩视频 spring部分-17_spring_SSH整合02_OpenSessionInViewer的讲解


思路就是创建一个filter,这个filter在视图请求的过程中获取到Spring所管理的SessionFactory对象。 这样便解决了视图层Session无法获取的问题。

1. 首先创建一个OpenSessionFilter.java

OpenSessionFilter

package com.lj.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

public class OpenSessionFilter implements Filter {
	
	
	//Spring的工厂,在init中获取
	private WebApplicationContext wac;
	private static SessionFactory factory;
	private static ThreadLocal<Session> sessionHolder=new ThreadLocal<Session>();
	
	private static void setSession(Session session){
		sessionHolder.set(session);
	}
	
	public static Session getSession(){
		return sessionHolder.get();
	}
	
	private static void removeSession(){
		sessionHolder.remove();
	}
	
	
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		 
		/**
		 * 在这里获取Spring的工厂信息,在init里面就只会执行一次
		 * 使用WebApplicationContextUtils.getWebApplicationContext(ServletContext)来获取Web中的Spring工厂。
		 * 这种手段非常重要,要熟悉
		 */
		 
		wac=WebApplicationContextUtils.getWebApplicationContext(filterConfig.getServletContext());
		//我们在beans.xml中定义的sessionFactory <bean id="sessionFactory">
		factory=(SessionFactory) wac.getBean("sessionFactory");
		
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws IOException, ServletException {
		//开启session
		System.out.println("begin");
	    /** 要获取SessionFactory,需要先获取Spring的工厂
		 *  如果使用new ClassPathXmlApplicationContext(),就会产生一个新工厂,和Servlet初始化时的工厂是两个对象
		 *  必须通过其他方法来获取
		 *  在Spring中可以通过Web
		 */
		
		//这里不能用getCurrentSession,要用openSession()
		try {
			setSession(factory.openSession());
			chain.doFilter(req, res);
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//关闭session
		System.out.println("back");
	}

	@Override
	public void destroy() {

	}

}


2. 在web.xml中配置filter

<filter>
		<filter-name>mySessionInViewerFilter</filter-name>
		<filter-class>com.lj.filter.OpenSessionFilter</filter-class>
	</filter>
	<filter-mapping>
		
		<filter-name>mySessionInViewerFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>


Note: 注意这里如果使用的是struts2, 那么struts2的url-pattern也是/*,所有的请求都会被struts2的拦截器拦截, 这个filter也就不会起作用了。
因此必须要将这个filter的配置放在Struts2的前面,才能正常使用。



这时就可以在Dao层调用这个类来获取Session,例如:
	public List<Group> list() {
		// TODO Auto-generated method stub
		//return this.getSession().createQuery("from Group").list();
		return OpenSessionFilter.getSession().createQuery("from Group").list();
	}


这样web容器便会在视图层中获取Session,并执行相应的Session操作。





==========================
Spring已经提供了OpenSessionInViewerFilter, 一般直接配置Spring的就可以了。
 
	<filter>
		<filter-name>openSessionInViewerFilter</filter-name>
		<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>openSessionInViewerFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping> 
分享到:
评论

相关推荐

    javaFilter自定义编码过滤器

    JavaFilter自定义编码过滤器知识点 一、Filter接口和 FilterChain接口 在 Java 中, Filter 接口和 FilterChain 接口是 Servlet 规范中的两个重要组件。 Filter 接口用于定义一个过滤器, FilterChain 接口用于将...

    vue自定义过滤器,例如给文字加颜色

    vue.js的filter定义的方式,已经简单的demo,自定义过滤器如何给文字加颜色

    Python Django模板之模板过滤器与自定义模板过滤器示例

    本文实例讲述了Python Django模板之模板过滤器与自定义模板过滤器。分享给大家供大家参考,具体如下: 模板过滤器 过滤器用于对模板变量进行操作。 date:改变日期的显示格式。 length:求长度。字符串,列表。 ...

    SpringSecurity学习之自定义过滤器的实现代码

    "SpringSecurity学习之自定义过滤器的实现代码" Spring Security学习之自定义过滤器的实现代码主要介绍了Spring Security学习之自定义过滤器的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有...

    .NET MVC授权过滤器验证登录

    然后,我们可以在控制器或特定动作上应用这个自定义的授权过滤器,确保只有登录的用户才能访问: ```csharp [CustomAuthorize] public class AccountController : Controller { public ActionResult Index() { /...

    在Django框架中自定义模板过滤器的方法

    ### 在Django框架中自定义模板过滤器的方法 #### 一、引言 Django作为最受欢迎的Python Web开发框架之一,提供了丰富的功能和强大的社区支持。在Django中,模板系统是一个非常重要的组成部分,用于处理前端展示...

    详解Vue自定义过滤器的实现

    在Vue中,自定义过滤器是用于处理数据的一种机制,通常用于格式化或转换数据,使其更符合展示需求。本文将深入探讨如何在Vue中实现自定义过滤器。 一、全局注册自定义过滤器 1. 使用 `Vue.filter()` 方法来全局...

    SpringBoot的filter过滤器(源代码)

    SpringBoot的filter过滤器 一、过滤器的作用和概述 1.1 简述 1.2 使用场景 二、自定义过滤的两种方式 ...2.3.4自定义过滤器类UserLoginFilter.java 2.3.5 templates下的index页面 2.3.6被拦截后重定向的页面 2.3.7 测试

    使用AngularJS创建自定义的过滤器的方法

    总之,AngularJS通过提供内置过滤器和自定义过滤器的能力,赋予开发者强大的数据处理能力,使他们能够在不直接修改数据源的情况下调整数据的显示方式。这种方法提高了代码的复用性,并且在保持了数据源不变的前提下...

    Python自定义计算时间过滤器实现过程解析

    在Python编程中,自定义过滤器是Django模板语言(DTL)中增强模板功能的一种方式,它允许开发者创建自己的函数来处理数据,以便在模板渲染时应用特定的逻辑。本篇文章将深入探讨如何在Python中实现一个计算时间差的...

    自定义表单设计器演示版源码(C#).rar.rar

    自定义表单设计器是一种强大的工具,它允许用户根据自己的需求创建和定制各种数据输入界面,无需深入编程细节。本项目提供了C#语言实现的自定义表单设计器的演示版源码,这对于开发者来说是一个很好的学习资源,特别...

    Hangfire 仪表板的 一些授权过滤器_C#_代码_相关文件_下载

    在 "Hangfire.Dashboard.Authorization-master" 压缩包中,你将找到一组 C# 代码,这些代码提供了自定义授权过滤器的示例和实现。这些过滤器可以根据你的应用需求,比如用户身份验证、角色检查或其他业务规则,来...

    自定义Navigation导航器(支持动态配置)

    自定义Navigation导航器(支持动态配置) 自定义Navigation导航器(支持动态配置) 自定义Navigation导航器(支持动态配置) 自定义Navigation导航器(支持动态配置) 自定义Navigation导航器(支持动态配置) ...

    Vue过滤器的用法和自定义过滤器使用

    Vue提供了内置过滤器,如`capitalize`、`uppercase`、`lowercase`、`currency`等,但很多时候,我们需要创建自定义过滤器以满足特定的业务逻辑。自定义过滤器的定义语法如下: ```javascript Vue.filter('...

    安卓自定义男女选择器

    "安卓自定义男女选择器"就是一个专门解决这一问题的组件,它允许用户在男性和女性之间进行选择,并且可以设定为只能选择一个性别,避免了多选或者误选的情况。本篇文章将详细介绍如何在安卓应用中实现这样一个自定义...

    安卓自定义时间选择器

    系统提供了预设的时间选择器对话框,但有时为了满足特定的UI设计或者功能需求,开发者需要自定义时间选择器。本教程将深入探讨如何在安卓平台上创建自定义的时间选择器。 首先,我们从基础开始。在安卓中,`...

    Django自定义过滤器定义与用法示例

    Django自定义过滤器是Django模板系统中一个强大的功能,它允许开发者根据自己的需求,创建可重用的模板标记,从而在模板中执行各种自定义逻辑。接下来,我们将详细探讨Django自定义过滤器的概念、功能、定义以及用法...

Global site tag (gtag.js) - Google Analytics