HttpRequest对象的getSession()方法

本文介绍HttpRequest对象中getSession方法的两种调用方式,详细解释了这两种方式如何处理现有会话及创建新会话的过程。
HttpRequest对象有两种形式的getSession方法调用:
1、getSession(),
2、getSession(boolean isNew)

这样的,前者会检测当前时候有session存在,如果不存在则创建一个,如果存在就返回当前的。
getSession()相当于getSession(true),

参数为true时,若存在会话则返回该会话,否则新建一个会话。
参数为false时,若存在会话则返回该会话,否则应该返回一个NULL

这是文档:

getSession
public HttpSession getSession(boolean create)Returns the current HttpSession associated with this request or, if if there is no current session and create is true, returns a new session.
If create is false and the request has no valid HttpSession, this method returns null.

To make sure the session is properly maintained, you must call this method before the response is committed. If the container is using cookies to maintain session integrity and is asked to create a new session when the response is committed, an IllegalStateException is thrown.

Parameters:
true - to create a new session for this request if necessary; false to return null if there's no current session
Returns:
the HttpSession associated with this request or null if create is false and the request has no valid session
在Dubbo服务提供方的方法里向`HttpServletRequestImpl`的session保存信息,通常不能直接传递`HttpServletRequestImpl`对象,但可以通过以下思路实现: ### 提取必要信息传递 将`HttpServletRequest`中的必要信息提取出来,封装到一个实现了`Serializable`接口的自定义类中,在Dubbo服务调用时传递这个自定义类对象,然后在服务提供方根据这些信息操作`HttpServletRequest`的session。 ```java import java.io.Serializable; // 自定义可序列化类 class RequestInfo implements Serializable { private String sessionId; // 可以根据需要添加更多属性 public RequestInfo(String sessionId) { this.sessionId = sessionId; } public String getSessionId() { return sessionId; } public void setSessionId(String sessionId) { this.sessionId = sessionId; } } // 在服务消费者端 import javax.servlet.http.HttpServletRequest; class ServiceConsumer { public RequestInfo prepareRequestInfo(HttpServletRequest request) { String sessionId = request.getSession().getId(); return new RequestInfo(sessionId); } } // 在服务提供者端 import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.util.Enumeration; class ServiceProvider { public void saveInfoToSession(RequestInfo requestInfo, String key, Object value) { // 这里需要根据实际情况获取HttpServletRequest对象 // 假设通过某种方式获取到了request对象 // 例如在Servlet环境中,可以通过ThreadLocal等方式获取 HttpServletRequest request = getRequest(); if (request != null) { HttpSession session = request.getSession(false); if (session != null && session.getId().equals(requestInfo.getSessionId())) { session.setAttribute(key, value); } } } private HttpServletRequest getRequest() { // 实现获取HttpServletRequest的逻辑 return null; } } ``` ### 使用ThreadLocal传递 在服务消费者端将`HttpServletRequest`对象存储到`ThreadLocal`中,在服务提供者端从`ThreadLocal`中获取`HttpServletRequest`对象,然后操作session。 ```java import javax.servlet.http.HttpServletRequest; class RequestHolder { private static final ThreadLocal<HttpServletRequest> requestHolder = new ThreadLocal<>(); public static void setRequest(HttpServletRequest request) { requestHolder.set(request); } public static HttpServletRequest getRequest() { return requestHolder.get(); } public static void removeRequest() { requestHolder.remove(); } } // 在服务消费者端拦截器或过滤器中设置请求 import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; class RequestFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { HttpServletRequest httpRequest = (HttpServletRequest) request; RequestHolder.setRequest(httpRequest); try { chain.doFilter(request, response); } finally { RequestHolder.removeRequest(); } } } // 在服务提供者端方法中操作session import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; class Service { public void saveInfoToSession(String key, Object value) { HttpServletRequest request = RequestHolder.getRequest(); if (request != null) { HttpSession session = request.getSession(); session.setAttribute(key, value); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值