Springboot在linux系统中,首次request.getSession()速度慢问题

本文介绍了解决Tomcat启动后首次使用request.getSession()方法响应慢的问题。通过修改Java安全配置,将随机数源从/dev/random更改为/dev/urandom,显著提高了会话创建速度。

tomcat启动成功后,第一次调用request.getSession()返回速度慢

解决办法:

1:修改文件:$JAVA_PATH/jre/lib/security/java.security 中securerandom.source=file:/dev/random 改为securerandom.source=file:/dev/urandom

2:在catalina.sh中加入这么一行:-Djava.security.egd=file:/dev/./urandom 即可

 

 

转自 https://blog.youkuaiyun.com/lsm135/article/details/77801052

<think>我们正在讨论JavaWeb开发中的Servlet技术,特别是关于`request.getSession().getAttribute()`方法的使用。用户的问题是如何通过这个方法获取GET请求的参数值。首先,需要澄清一个关键点:`request.getSession().getAttribute()`方法用于从会话(session)范围中获取属性,而不是直接从请求(request)中获取参数。GET请求的参数通常是通过`request.getParameter()`方法获取的,因为它们是附加在URL上的查询字符串。但是,用户可能希望将GET请求的参数存储在会话中,然后再通过`getSession().getAttribute()`来获取。如果是这样,我们需要先使用`request.getParameter()`获取参数值,然后将其设置到会话中。根据引用[1]和[3]:-`request.setAttribute()`和`request.getAttribute()`用于请求范围内的属性传递,通常用于请求转发(forward)的场景。-`request.getSession().setAttribute()`和`request.getSession().getAttribute()`用于会话范围内的属性传递,这些属性在整个会话期间都可用(除非被移除或会话过期)。因此,直接使用`request.getSession().getAttribute()`是无法获取GET请求参数的,因为GET请求参数是请求的一部分,而不是会话的一部分。解决步骤:1.在接收到GET请求时,使用`request.getParameter(Stringname)`获取参数值。2.如果需要在整个会话期间使用该值,则使用`request.getSession().setAttribute(Stringname,Objectvalue)`将其存储到会话中。3.在后续的请求中,就可以使用`request.getSession().getAttribute(Stringname)`来获取该值。示例代码:```java//在Servlet中处理GET请求protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{//1.获取GET请求参数StringparamValue=request.getParameter("paramName");//2.将参数值存储到会话中HttpSessionsession=request.getSession();session.setAttribute("sessionAttrName",paramValue);//...其他处理}//在同一个会话的后续请求中(可以是另一个Servlet或JSP)Objectvalue=request.getSession().getAttribute("sessionAttrName");if(value!=null){StringsessionValue=(String)value;//使用sessionValue}```注意:-如果用户没有在会话中设置参数值,那么`getSession().getAttribute()`将返回null(如引用[2]和[3]所述)。-另外,引用[4]提到,`request.getSession()`等同于`request.getSession(true)`,如果会话不存在则创建一个新的。而`request.getSession(false)`如果会话不存在则返回null。因此,用户的问题可能源于混淆了请求参数和会话属性。我们需要明确:GET请求参数必须通过`request.getParameter()`获取,然后有选择地存储到会话中。相关问题:1.请求参数(requestparameter)和会话属性(sessionattribute)有什么区别?2.JavaServlet中,如何在不同请求之间共享数据?3.使用会话(session)存储数据时需要注意哪些问题?</think>### 如何通过 `request.getSession().getAttribute()` 获取 GET 请求参数值 在 Java Servlet 中,`request.getSession().getAttribute()` **无法直接获取 GET 请求参数**,因为它操作的是会话(Session)范围的数据,而非请求(Request)参数。以下是正确解决方案: #### 🔍 核心区别与正确方法 1. **作用域不同** - `request.getParameter()`:获取 **请求参数**(URL 或表单数据),作用域仅限当前请求 例如:`String value = request.getParameter("key");` - `session.getAttribute()`:获取 **会话属性**(跨请求共享的数据),作用域是整个会话周期[^3][^4] 2. **GET 请求参数的正确获取方式** 直接通过 `request.getParameter()` 获取 URL 参数: ```java // 在 Servlet 的 doGet 方法中 protected void doGet(HttpServletRequest request, HttpServletResponse response) { String paramValue = request.getParameter("paramName"); // 直接获取URL参数 System.out.println("GET参数值: " + paramValue); } ``` 3. **若需跨请求使用参数** 先将请求参数存入 Session,再通过 `getAttribute()` 读取: ```java // 步骤1:存储到Session String paramValue = request.getParameter("paramName"); request.getSession().setAttribute("sessionKey", paramValue); // 存入Session // 步骤2:在其他请求中读取(注意判空) HttpSession session = request.getSession(false); // 不自动创建新Session if (session != null) { String sessionValue = (String) session.getAttribute("sessionKey"); if (sessionValue != null) { System.out.println("从Session读取: " + sessionValue); } } ``` #### ⚠️ 关键注意事项 1. **空值处理** `session.getAttribute()` 可能返回 `null`(如属性不存在或会话过期),必须判空[^2][^3]: ```java Object value = request.getSession().getAttribute("key"); if (value == null) { // 处理空值逻辑 } ``` 2. **会话创建方式** - `request.getSession()`:不存在时自动创建新会话 - `request.getSession(false)`:不存在时返回 `null`(避免创建无用会话)[^4] 3. **数据类型转换** `getAttribute()` 返回 `Object` 类型,需显式转换: ```java String data = (String) session.getAttribute("key"); // 强制类型转换 ``` #### 💡 总结流程 ```mermaid graph LR A[GET请求] --> B[request.getParameter<br>获取URL参数] B --> C{需跨请求共享?} C -->|是| D[session.setAttribute<br>存入会话] C -->|否| E[直接使用参数] D --> F[后续请求中<br>session.getAttribute读取] ``` > **重要提示**:直接通过 `session.getAttribute()` 获取 GET 参数是常见误解。请求参数必须先用 `getParameter()` 提取,再根据需要决定是否存入 Session[^3][^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值