思路:使用装饰者模式,定义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的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
自定义Session管理

1068

被折叠的 条评论
为什么被折叠?



