`

共享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的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

 

分享到:
评论

相关推荐

    session共享项目测试

    3. **拦截器或过滤器**:在每个服务的请求处理链路中,添加拦截器或过滤器,检查请求中的Session ID,然后从Redis中获取相应的Session数据。 4. **更新与删除操作**:当Session数据发生变化时(如用户购物车添加商品...

    spring session实现session共享

    4. **Filter**: 为了实现Session共享,Spring Session 使用一个自定义的Servlet过滤器(`DelegatingSessionFilter`),这个过滤器负责拦截HTTP请求,处理Session相关操作。 5. **Spring Boot集成**: 如果使用Spring...

    springboot 项目,基于springsession整合redis实现登录拦截功能

    权限控制则是在过滤器或拦截器中实现,检查每个请求是否包含有效的Session以及用户是否有访问特定资源的权限。 5. **使用SessionRepository**: 在Spring Boot应用中,我们可以注入`SessionRepository`接口,通过...

    session共享插件

    6. **安全性考虑**:使用memcached共享session时,需要注意安全问题,例如防止session hijacking(会话劫持)和session fixation攻击。可以使用HTTPS、定期刷新session ID、限制session的有效范围等方式增强安全性。...

    redis 集群共享Session

    - **中间件或过滤器**:在Web应用中,添加一个中间件或过滤器,负责拦截每个HTTP请求。当请求到达时,检查请求头中的SessionID,如果存在,则从Redis中读取对应的数据;响应时,将Session数据写回Redis。 - **...

    基于redis的集群session共享jar包

    4. **过滤器或拦截器**: 在Web应用中,为了在每个请求之间透明地处理session,通常会使用过滤器或者拦截器来拦截请求,然后由它们调用SessionManager进行session操作。 5. **配置**: 配置文件或代码中需要设置Redis...

    nginx+springboot+dubbo +redis session共享

    3. 在Dubbo服务提供者和消费者间,确保session信息的正确传递,可能需要通过自定义拦截器或过滤器来实现。 4. 配置Redis,作为session存储服务器,确保其稳定性和性能。 通过这样的组合,可以在分布式环境中实现...

    memcached-session-manager 实现 tomcat session共享

    例如,你可以使用 JMX (Java Management Extensions) 来监控和管理 Session 状态,或者通过过滤器来拦截 Session 操作。此外,还可以结合 Spring 或其他框架进一步简化配置和使用。 总结,memcached-session-...

    Struts2 配置登陆拦截器

    本篇文章将详细介绍如何配置Struts2的登录拦截器,以及其背后的原理和实践应用。 首先,让我们理解一下拦截器的概念。在Struts2中,拦截器是基于Java的动态代理机制实现的,它们按照预定义的顺序对Action调用进行...

    shiro,redis,cache实现共享session代码中几个注意的地方改进

    在实现基于Redis的缓存共享Session时,Shiro提供了一种高效且可扩展的方法。在这个过程中,有几个关键点需要注意,以确保系统的稳定性和性能。下面我们将深入探讨这些要点。 首先,我们来看`...

    java过滤器

    过滤器之间可以共享信息,例如,一个登录验证过滤器可以在会话中设置一个标志,然后后续的过滤器可以根据这个标志进行不同操作。 5. **过滤器生命周期**: 每个过滤器都有自己的生命周期,包括初始化(init())、...

    通过过滤器管理用户权限(2)

    过滤器在Java Web开发中扮演着重要角色,尤其是在处理请求和响应时进行预处理和后处理。在这个主题中,我们将主要关注Spring框架中的Filter机制,以及如何利用它来实现用户权限控制。 在Java Servlet规范中,Filter...

    基于spring-cloud分布式session共享文档

    - **解决方法**:使用`RequestInterceptor`拦截器手动添加Session信息。 ```java @Configuration public class FeignConfig { @Bean public RequestInterceptor requestInterceptor() { return new ...

    session过期处理

    - 自动跳转到登录页:服务器可以设置拦截器或过滤器,当检测到Session过期,直接重定向到登录页面。 - 提示信息:告知用户Session已过期,需要重新登录。 4. **Session与Cookie的关系**:Session依赖于Cookie来...

    shiro中session的共享问题与完成前后端权限的校验

    3. 定义过滤器链,配置需要拦截的URL及其对应的过滤器。 4. 在Spring Boot的启动类上添加注解@EnableShiro,启用Shiro配置。 Vue作为前端框架,可以通过Axios等库发送带Token的请求。同时,前端也可以根据Shiro返回...

    j2ee项目使用filter和memcached实现session服务器

    本项目通过结合使用Filter(过滤器)和Memcached来实现一个高效的session服务器,以解决跨服务器会话共享的问题。 首先,让我们详细了解一下`Filter`。在Java Web开发中,Filter是Servlet API的一部分,允许开发者...

    sessionRedis.rar

    在Session共享场景中,Spring MVC可以配置拦截器来处理Session相关操作,比如设置和读取Session数据。 其次,**Apache Shiro** 是一个强大的安全框架,用于处理身份验证、授权(权限控制)和会话管理。在多服务器...

    改进基于filter的远程分布式session存储

    描述中提到的博文链接虽然没有具体内容,但我们可以推测博主可能分享了如何通过Filter(过滤器)来优化这个过程。Filter是Java Servlet规范的一部分,它允许开发者在请求处理前或处理后进行拦截和处理,例如在请求...

    Spring-session2整合spring5+redis

    Spring Session提供了拦截器、过滤器等多种集成方式,使得在Spring应用中集成非常方便。 其次,Hibernate 5是一个流行的Java ORM框架,用于简化数据库操作。它允许开发人员使用Java对象来操作数据库记录,而不是...

Global site tag (gtag.js) - Google Analytics