`

共享session,以及过滤器和拦截器的区别

阅读更多

思路:使用装饰者模式,定义MyRequestSessionWrapper类继承HttpServletRequestWrapper类,重写session的get和setAttr等方法;然后通过filter在执行servlet前,用MyRequestSessionWrapper对象来代替HttpServletRequest。

代码如下:

public class MyRequestSessionWrapper extends HttpServletRequestWrapper {

	public MyRequestSessionWrapper(HttpServletRequest request) {
		super(request);
	}

	@Override
	public HttpSession getSession() {
		//在分布式集群项目中,从redis中获取共享的session
		System.out.println("重写了sesson获取方式,从redis获取session~~~");
		return super.getSession();
	}
	
}

 filter替换自定义的request包装类代码如下:

public class MySessionFilter implements Filter {

    public MySessionFilter() {
    }
	public void destroy() {
	}
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		request = new MyRequestSessionWrapper((HttpServletRequest)request);
		chain.doFilter(request, response);
	}
	public void init(FilterConfig fConfig) throws ServletException {
	}

}

 

另外,过滤器、拦截器、监听器的区别如下:

过滤器:【可配在web.xml】过滤器Filter常用来过滤字符编码、业务逻辑判断等,依赖servlet容器,即对请求和返回等进行过滤,预处理或后续处理。比如:

    <filter>
		<filter-name>CharacterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>utf-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

 

拦截器:并不在web.xml】常用于切面编程,基于java的反射机制,比如权限管理、日志等,比如静态文件和请求地址的权限。可对某action或service方法执行前后做操作。比如spring的aop切面编程。

 

监听器:【可配在web.xml】监听器监听某个事件,并在此事件前后做一些操作。web启动时创建,只初始化一次,web停止则销毁。可用来初始化一些配置信息。比如:

    <listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

 

执行顺序为:过滤前–拦截前–action调用–拦截后–过滤后

拦截器与过滤器的区别(引用网上的对比):

1)拦截器是基于java的反射机制的,而过滤器是基于函数回调。

2)拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

3)拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

4)拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

5)在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics