`

由request.getSession()想到的函数参数设计原则

 
阅读更多
我们经常这么干,通过request.getSession()获取到session,然后查询其中的变量来判断当前用户是否登录。一天遇到有人问,能不能通过request.getSession()==null来判断用户没有登录呢?立马想到,什么时候会返回空呢?浏览器每次访问到服务器时,服务器会自动给创建一个session啊。那不能为空啊?但是超时或者通过手动的invalidate()之后session确实会失效,失效了返回就应该是空啊?
查看API才知道getSession()还有另外一个可以传递boolean类型参数的版本,传递true表示没有获取到session时自动创建一个,传递false则不创建。疑问解开了,还是自己太二了,不了解人家的API。但是后来发现,网上其他很多人都遇到了这个相同的疑问,开始反思这API设计的是否有问题。之所以出现这样的疑问,是因为大家很容易将这个函数的boolean参数给遗忘掉,以至于到最后大家都每天熟练的使用request.getSession(),只知道他能获取到session。这是函数设计上的一个忌讳,《Clear Code》中说标识参数(布尔参数)的存在意味着你在公然宣布,这个函数做了不止一件事,即便是HttpServletRequest中的getSession做了重载,但是它起到的效果是一样的(对外界来说是一个函数做了两件事情)。
另外,getSession()函数的名称和其实际的操作内容也有出入,《Clear Code》中说函数实际的操作要与名称相符,不能背后还有其他副作用(这也是“只做一件事”的原则),而getSession()却不仅仅只是“get“,还带有了”create“的含义。
当然了,也许设计者考虑的是,getSession(true)比getSession(false)更为常用,并且创建一个session也无关紧要,也不影响谁,所以有意将getSession(flase)给弱化了。


分享到:
评论

相关推荐

    于笑扬java综合知识点总结-必背(吐血推荐).doc

    request.getSession()方法用于获取当前会话,request.getSession(false)和request.getSession(true)是它的变体: * request.getSession():获取当前会话,如果不存在则创建一个新的会话 * request.getSession(false...

    通用分页js

    - 在调用`createPageHTML`函数之前,应确保已正确初始化所有必要的参数。 - 对于安全性较高的应用,还需对URL参数进行验证,避免非法请求导致的安全问题。 #### 五、扩展功能建议 1. **自定义样式**:可以通过...

    于笑扬java综合知识点总结-必背.pdf

    request.getSession() reqeust.getSession(false)和 request.getSession(true) 在 Servlet 中,request.getSession() 方法用于获取当前会话对象。如果没有当前会话对象,request.getSession() 方法将创建一个新的...

    ASP.Net WebAPI与Ajax进行跨域数据交互时Cookies数据的传递

    var response = Request.CreateResponse(HttpStatusCode.OK); response.Content = new StringContent(string.Format("success_jsonpCallback({0})", JsonConvert.SerializeObject(data)), Encoding.UTF8, ...

    J2EE复习题1

    6. Servlet与JSP:在Servlet中,`request.getParameter()`用于获取请求参数;JSP EL(Expression Language)表达式`${user.loginName}`等价于JSP脚本let `<%=user.getLoginName()%>`,用于输出用户登录名。 7. ...

    ajax回调函数接收后台传输的数据如何设置编码方式.docx

    接着,我们通过`Request.getParameter()`获取前端传递的参数,然后处理并保存数据。 ```csharp public void saveAll(ModelMap model, HttpServletRequest request, HttpServletResponse response) throws Exception...

    struts2中action如何获取jsp页面参数1.pdf

    避免直接操作Servlet对象,可以使Action更加纯粹,更符合MVC设计原则。 5. **使用ActionContext的注意事项** 由于ActionContext的实例在Action执行时才创建,因此不建议在Action的构造函数中使用`ActionContext....

    java程序员滴宝典

    - **实现Runnable接口**:实现Runnable接口的run方法,并将其作为参数传递给Thread构造函数。 2. **同步的实现方法**: - **synchronized关键字**:用于方法或代码块,确保同一时刻只有一个线程可以访问。 - **...

    JavaBean的简单利用

    request.getSession().setAttribute("currentStudent", student); response.sendRedirect("success.jsp"); } else { // 登录失败,重定向到错误页面 response.sendRedirect("error.jsp"); } } private ...

    JavaBean 在jsp和serlvle中传递技术要点.doc

    HttpSession session = request.getSession(true); package.className beanRef = (package.className) session.getAttribute("beanName"); session.setAttribute("beanName", beanRef); // 应用程序范围 package....

    proj_Model2_ManagementSystem:Java Servlet和JSP

    Servlet:HttpSession会话= request.getSession()/ session.setAttribute() jsp:<%= session.getAttribute(“ message”)%> EL / JSTL EL:$ {}页,请求,会话,应用程序 JSTL:“条件表达式”>〜 ...

    jstl_fn函数标签库的使用

    request.getSession().setAttribute("arrayList1", arrayList1); %> ${fn:length(sessionScope.arrayList1)} ``` 在这个例子中,`fn:length(sessionScope.arrayList1)`将返回3,即数组列表中元素的数量。 ##### 2....

    jsp九大内置对象

    - **PageContext对象**: 提供了访问页面的许多属性和方法,如 `getRequest`, `getResponse`, `getOut`, `getSession` 等。 #### 9. Exception对象 **概述** - **定义**: 在处理异常的网页中可以直接访问 `...

    题目关于JAVA

    瞬时态的对象未被Session管理,持久态的对象由Session管理且与数据库记录对应,游离态是持久态对象离开Session后变为游离状态。 22. 在Action中访问session、request、response的方法: ```java // 访问session ...

    struts2 中action 如何获取jsp 页面参数1.pdf

    HttpSession session = ServletActionContext.getRequest().getSession(); ``` `ServletActionContext`提供了如下几个对象的访问接口: 1. `HttpServletRequest`:HTTP servlet请求对象 2. `HttpServletResponse`:...

    工具类知识点

    user = (User) request.getSession().getAttribute("user"); String userId; if (user != null) { userId = user.getUserid(); } else { userId = request.getHeader("userid"); user = userService.getById...

    fileupload上传代码与txt文件取值实例

    File targetFile = new File(request.getSession().getServletContext().getRealPath(targetFolder)); // 获取项目路径下的临时目录 File tempFile = new File(request.getSession().getServletContext()....

    java实现购物车功能

    CartSession cart = (CartSession) request.getSession().getAttribute("cart"); if (cart == null) { cart = new CartSession(); request.getSession().setAttribute("cart", cart); } cart.addItem(itemId, ...

Global site tag (gtag.js) - Google Analytics