由于我希望提供各种客户端来连接Spring提供的服务,
(客户端种类至少包括:Flex/AIR、MS WinForm、Ajax、纯JSP)
所以Spring必须识别不同种类的客户端,并从中取得request,这样才能拿到类似IP地址这样的客户端信息。
这里说的“取得”,不是在JSP的代码里,JSP里根本不用“取得”,request就在那里。
这里是说在,Spring的代码中,如何识别各种客户端,并取得request
HttpServletRequest request = null; if (request == null) { // JSP客户端 try { // TODO 如何在纯JSP发送过来请求的时候,得到request? if (request != null) { log.info("Connected a Web client with JSP."); } } catch (Exception e) { } } if (request == null) { // Struts2客户端 try { //request = (HttpServletRequest)ServletActionContext.getRequest(); // 把上一行的代码,变成反射的写法,是为了在不使用Struts2前台的应用中就可以不必需要Struts2的jar包了 Class c; c = Class.forName("org.apache.struts2.ServletActionContext"); Method m = c.getMethod("getRequest", new Class[] {}); request = (HttpServletRequest) m.invoke(c, new Object[] {}); if (request != null) { log.info("Connected a Web client with Struts2."); } } catch (Exception e) { } } if (request == null) { // Hessian客户端 try { //request = (HttpServletRequest)ServiceContext.getContextRequest(); // 把上一行的代码,变成反射的写法,是为了在不使用Hessian做RPC的应用中就可以不必需要Hessian的jar包了 Class c; c = Class.forName("com.caucho.services.server.ServiceContext"); Method m = c.getMethod("getContextRequest", new Class[] {}); request = (HttpServletRequest) m.invoke(c, new Object[] {}); if (request != null) { log.info("Connected a .Net client with Hessian RPC."); } } catch (Exception e) { } } if (request == null) { // Flex/AIR客户端 try { //request = FlexContext.getHttpRequest(); // 把上一行的代码,变成反射的写法,是为了在不使用Flex/AIR前台的应用中就可以不必需要Flex的jar包了 Class c; c = Class.forName("flex.messaging.FlexContext"); Method m = c.getMethod("getHttpRequest", new Class[] {}); request = (HttpServletRequest) m.invoke(c, new Object[] {}); if (request != null) { log.info("Connected a Flex/AIR client with AMF RPC."); } } catch (Exception e) { } } String ipAddress = ""; if (request != null) { ipAddress = request.getRemoteAddr(); if ("".equals(ipAddress)) { log.info("Client IP Address is unknow."); } else { log.info("Client IP Address is: " + ipAddress); } }
以上代码,在Spring中完成了对 Struts2、Hessian、AMF(BlazeDS)的识别,并提取requst。
但是,目前我还没有找到普通的纯JSP来调用Spring时,该如何取得request的方法。
(JSP中调用Spring的代码如下:)
ServletContext servletContext = request.getSession().getServletContext(); WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext); MyService myService=(MyService)wac.getBean("myService"); // "myService"是Spring中注入的服务Bean
如知道这个(第一段代码中的TODO部分)怎么写的,请给我个回复,谢谢了。
------------------------六年后的一条分割线---------------------------------
无意中翻出这篇老博文,文章中留下的遗憾“纯JSP如何获取request”早已“破解”
// 要在web.xml增加如下监听器: // <listener> //<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> // </listener> request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
而且,当if/else if太多了以后,这么写真的不太雅观。
因此,我推荐采用“责任链模式”,把这段代码改写一下,具体如何使用责任链模式,已经超出本文的范畴,感兴趣的话,去看一下讲设计模式的文章吧。
相关推荐
编写一个`SpringMvcHandler`,它实现了`ChannelInboundHandlerAdapter`,并将Netty接收到的HTTP请求转化为Spring MVC的`HttpServletRequest`和`HttpServletResponse`对象,然后调用相应的Controller方法。...
1. **Servlet API集成**:`spring-web`提供了对Servlet API的封装,如`HttpServletRequest`和`HttpServletResponse`的包装类,使得开发者可以更方便地处理HTTP请求和响应。 2. **WebSocket支持**:它提供了...
《Spring框架Web模块详解——聚焦于WebSocket服务器端点支持》 在Java开发领域,Spring框架以其强大的功能和灵活的设计闻名,而`org.springframework.web`包是Spring框架中的一个重要部分,它提供了处理HTTP请求和...
- **企业级Web应用**:由于其强大的灵活性和可扩展性,Spring Web MVC广泛应用于各种规模的企业级Web应用开发中。 - **RESTful服务**:利用Spring Web MVC提供的RESTful支持,可以快速构建出高性能的RESTful服务。 -...
了解并熟练掌握这些`HttpServletRequest` 的常用方法,对于开发Java Web应用程序至关重要,它们能够帮助开发者有效地获取和处理客户端发送的信息,实现各种业务逻辑。在实际开发中,还可能需要结合Servlet规范、过滤...
在本文中,我们将探讨如何将Direct Web Remoting (DWR) 3.0与...通过这种方式,DWR 3.0与Spring 2.5的整合使用注解配置简化了开发流程,使得Java后端的方法可以直接在客户端JavaScript中调用,实现前后端的无缝交互。
2. 错误处理:客户端应能处理各种网络错误,如超时、无网络连接等,并向用户提供友好的提示。 3. 重试机制:当网络不稳定时,可以考虑加入重试机制,提高用户体验。 4. 状态管理:登录状态可以在客户端持久化,如...
在 Spring 框架中,获取客户端 IP 地址是一个常见的需求,尤其是在处理网络请求时,我们需要知道请求来源的 IP 地址来实现如日志记录、安全控制等功能。Spring 提供了多种方式来获取请求中的 IP 地址。 首先,我们...
标题中的“利用Spring Security控制同一个用户只能一次登录”是指在基于Spring Security的Web应用程序中实现单点登录(Single Sign-On, SSO)的功能,确保同一时间只有一个设备或浏览器会话可以登录同一用户的账户。...
1. **HttpServletRequest**: Spring MVC 中的 Controller 方法参数可以直接接受 `HttpServletRequest` 对象,然后通过 `request.getRemoteAddr()` 来获取 IP 地址。但需要注意,如果应用部署在反向代理(如 Nginx)...
2.4获得Spring安全 21 2.4.1使用Maven 21 Maven仓库 21 Spring框架 22 2.4.2 Gradle 23 Gradle存储库 23 使用Spring 4.0.x和Gradle 24 2.4.3项目模块 25 核心 - spring-security-core.jar 25 远程处理 - spring-...
在上述代码中,`HttpServletRequest`的`getRemoteAddr()`方法用于获取客户端的IP地址。然而,如果应用部署在反向代理服务器(如Nginx)后,这个方法可能返回的是代理服务器的IP,而非实际用户的IP。这时,我们可以...
在Spring MVC中,我们可以创建RESTful服务,通过HTTP的CRUD(Create, Read, Update, Delete)方法来处理客户端请求。例如,创建一个处理AJAX请求的Controller,定义一个`@RequestMapping`注解的方法,接收GET或POST...
本文将深入探讨如何在Spring Security中实现IP过滤器,以便控制访问应用的客户端IP地址。 首先,我们需要理解Spring Security的基本架构。它是一个多层次的组件模型,其中包括认证、授权和会话管理等核心功能。在...
在Java Spring MVC框架中,Controller是处理HTTP请求的核心组件,它负责接收客户端发送的数据并进行业务逻辑处理。本文将详细讲解在Spring Controller中获取请求参数的六种常见方法。 1. **直接作为方法参数** 当...
当控制器方法上标注了`@ResponseBody`时,Spring MVC会将方法的返回值直接序列化为JSON或XML格式,并作为HTTP响应体返回给客户端。前端可以通过AJAX技术(如jQuery的$.ajax()方法)发送异步请求,并处理后端返回的...
### Spring Boot 中 Servlet Filters 和 ...通过本篇文章的学习,相信你已经掌握了如何在 Spring Boot 应用中使用这些技术的基本方法。接下来,你可以尝试将它们应用到实际项目中,进一步提高应用的功能性和可维护性。
在Android应用开发中,客户端与服务器端的通信是不可或缺的一部分,它使得移动设备能够获取、发送数据,实现功能如登录注册、数据同步、文件上传下载等。本Demo着重展示了这一核心概念,通过实例来帮助开发者理解和...
这里提到的“验证单例多用构造方法”可能是指 Spring MVC 中单例 Bean 的生命周期问题。Spring 管理的 Bean 默认是单例模式,即在整个应用中只有一个实例。当 Bean 采用构造方法初始化时,无论多少次请求,构造函数...