Spring Boot使用Servlet Session和Spring Session

1、直接使用Tomcat Session可以满足用户访问量不大的情况,因为Session是直接创建在应用部署的机器上,当并发用户量上来后,会发现应用机器的内存也直线上升,这样的架构是不可控的。

 

2、Servlet的Session功能全部都封装在HttpServletRequest中,所以Session的创建是需要用户手动操作的,一般是在登录认证通过以后,我们会通过HttpServletRequest#getSession(true)来创建一个Session,我们知道,Servlet Session是依赖Cookie的,创建Session后,会在HttpServletResponse设置一个名为JSESSIONID的cookie,当然,这个动作对用户来说是透明的。需要强调的是,Session这个对象不会自动创建,很多人误以为任意一个请求就会创建Session。所以大家不用去考虑Session的开关,因为没有开关,也不需要开关,不用担心没使用它时会占用你的机器资源,因为只有你手动调用了getSession()方法才有机会创建对应的Session和Cookie。

 

3、springboot2对Servlet Session的可配置参数如下:

server.servlet.session.cookie

private String name;
private String domain;
private String path;
private String comment;
private Boolean httpOnly;
private Boolean secure;
private Duration maxAge;

#sprinboot1的server相关配置
server.address 指定server绑定的地址
server.port 设定http监听端口
server-servlet-path 设定dispatcher-servlet 的监听路径,默认为/

server.compression.enabled 是否开启压缩,默认为false,Spring Boot默认没有启用Http包压缩功能,但是压缩对减少带宽和加快页面加载非常有用。
server.compression.excluded-user-agents 指定不压缩的user-agent 多个以逗号分隔,默认值为text/html,text/xml.text/plain,text/css
server.compression.mime-types 指定要压缩的mime-type,多个以逗号分隔.
server.compression.min-response-size 执行压缩的阈值,默认为2048

server.context-parameters.[param.name]设置servlet context参数
server.context-path 设定应用的展示名称,默认为application

server.jsp-servlet.class-name 设定编译jsp用的servlet,默认:org.apache.jasper.servlet.JspServlet
server.jsp-servlet.registered 设定jsp servlet是否注册到内嵌的servlet容器,默认为true
 
cookie,session属性
server.session.cookie.comment = #注释会话cookie。
server.session.cookie.domain = #会话cookie的域。
server.session.cookie.max-age = #会话cookie的最大年龄(以秒为单位)。
server.session.cookie.name = #会话cookie名称。
server.session.cookie.path = #会话cookie的路径。
server.session.cookie.secure = #“Secure”标志为会话cookie。
server.session.persistent = false #在重新启动之间持续会话数据。
server.session.store-dir = #用于存储会话数据的目录。
server.session.timeout = #会话超时(秒)。
server.session.tracking-modes =#会话跟踪模式(以下一个或多个:“cookie”,“url”,“ssl”)
ssl

server.ssl.ciphers 是否支持ssl ciphers
server.ssl.client-auth 设定client authentication是wanted 还是needed
server.ssl.enabled 是否开启ssl,默认为true
server.ssl.key-alias 设定key store中key的别名
server.ssl.key-password 访问key store中key的名称
server;ssl.key-store设定持有ssl certificate中的key store的路径.通常是.jks文件
server.ssl.key-store-password 设定访问key store的密码.
server.ssl.key-store-provider 设定key store的提供者.
server.ssl.key-store-type 设定key store的类型.
server.ssl.protocol 使用的SSL协议,默认: TLS
server.ssl.trust-store 持有SSL certificates的Trust store
server.ssl.trust-store-password 访问trust store的密码.
server.ssl.trust-store-provider 设定trust store的提供者.
server.ssl.trust-store-type 指定trust store的类型.

tomcat

server.tomcat.access-log-enabled 是否开启access log ,默认: false
server.tomcat.access-log-pattern 设定access logs的格式,默认: common
server.tomcat.accesslog.directory 设定log的目录,默认: logs
server.tomcat.accesslog.enabled 是否开启access log,默认: false
server.tomcat.accesslog.pattern 设定access logs的格式,默认: common
server.tomcat.accesslog.prefix 设定log 文件的前缀,默认: access_log
server.tomcat.accesslog.suffix 设定log 文件的后缀,默认: .log
server.tomcat.background-processor-delay 后台线程方法的delay大小: 30
server.tomcat.basedir 设定tomcat的base 目录,如果没有指定则使用临时目录.
server.tomcat.internal-proxies 设定信任的正则表达式,默认:“10.\d{1,3}.\d{1,3}.\d{1,3}| 192.168.\d{1,3}.\d{1,3}| 169.254.\d{1,3}.\d{1,3}| 127.\d{1,3}.\d{1,3}.\d{1,3}| 172.1[6-9]{1}.\d{1,3}.\d{1,3}| 172.2[0-9]{1}.\d{1,3}.\d{1,3}|172.3[0-1]{1}.\d{1,3}.\d{1,3}”
server.tomcat.max-http-header-size 设定http header的最小值,默认: 0
server.tomcat.max-threads 设定tomcat的最大工作线程数,默认为: 0
server.tomcat.port-header 设定http header使用的,用来覆盖原来port的value.
server.tomcat.protocol-header 设定Header包含的协议,通常是 X-Forwarded-Proto,如果remoteIpHeader有值,则将设置为RemoteIpValve.
server.tomcat.protocol-header-https-value 设定使用SSL的header的值,默认https.
server.tomcat.remote-ip-header 设定remote IP的header,如果remoteIpHeader有值,则设置为RemoteIpValve
server.tomcat.uri-encoding 设定URI的解码字符集.

undertow

server.undertow.access-log-dir 设定undertow access log 的目录,默认: logs
server.undertow.access-log-enabled 是否开启access log,默认: false
server.undertow.access-log-pattern 设定access logs的格式,默认: common
server.undertow.accesslog.dir 设定access log 的目录.
server.undertow.buffer-size 设定buffer的大小.
server.undertow.buffers-per-region 设定每个region的buffer数
server.undertow.direct-buffers 设定堆外内存
server.undertow.io-threads 设定I/O线程数.
server.undertow.worker-threads 设定工作线程数

 

 

 

 

好的,我可以回答你关于 Spring Boot 自定义 Session 的问题。 在 Spring Boot 中,Session 的默认实现是基于 Servlet 的 HttpSession 接口。如果你想要自定义 Session 实现,可以通过实现 Spring SessionSession 接口,并在配置文件中指定该实现来实现。 下面是一个使用 Redis 存储的自定义 Session 实现的示例代码: 首先,创建一个 RedisSession 类,实现 Session 接口,并实现相应的方法,如下所示: ```java public class RedisSession implements Session { private final String id; private Map<String, Object> attributes = new HashMap<>(); private boolean isNew; public RedisSession(String id) { this.id = id; this.isNew = true; } @Override public String getId() { return this.id; } @Override public <T> T getAttribute(String name) { return (T) this.attributes.get(name); } @Override public void setAttribute(String name, Object value) { this.attributes.put(name, value); this.isNew = false; } @Override public void removeAttribute(String name) { this.attributes.remove(name); } @Override public Instant getCreationTime() { throw new UnsupportedOperationException(); } @Override public void setLastAccessedTime(Instant lastAccessedTime) { throw new UnsupportedOperationException(); } @Override public Instant getLastAccessedTime() { throw new UnsupportedOperationException(); } @Override public void setMaxInactiveInterval(Duration interval) { throw new UnsupportedOperationException(); } @Override public Duration getMaxInactiveInterval() { throw new UnsupportedOperationException(); } @Override public boolean isExpired() { throw new UnsupportedOperationException(); } public boolean isNew() { return this.isNew; } } ``` 然后,创建一个 RedisSessionRepository 类,实现 SessionRepository 接口,并实现相应的方法,如下所示: ```java public class RedisSessionRepository implements SessionRepository<RedisSession> { private final RedisTemplate<String, RedisSession> redisTemplate; public RedisSessionRepository(RedisTemplate<String, RedisSession> redisTemplate) { this.redisTemplate = redisTemplate; } @Override public RedisSession createSession() { String id = UUID.randomUUID().toString(); RedisSession session = new RedisSession(id); this.redisTemplate.opsForValue().set(id, session); return session; } @Override public void save(RedisSession session) { this.redisTemplate.opsForValue().set(session.getId(), session); } @Override public RedisSession findById(String id) { return this.redisTemplate.opsForValue().get(id); } @Override public void deleteById(String id) { this.redisTemplate.delete(id); } } ``` 最后,在 Spring Boot 的配置文件中指定使用 RedisSessionRepository 实现 SessionRepository,如下所示: ```properties spring.session.store-type=redis spring.redis.host=localhost spring.redis.port=6379 spring.redis.password= spring.redis.timeout=10000 spring.session.redis.flush-mode=on_save spring.session.redis.namespace=spring:session spring.session.repository-type=redis ``` 以上就是关于 Spring Boot 自定义 Session 的步骤,希望能帮到你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值