`
TonyLian
  • 浏览: 401587 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring获得各种客户端HttpServletRequest的方法

阅读更多

由于我希望提供各种客户端来连接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太多了以后,这么写真的不太雅观。

 

因此,我推荐采用“责任链模式”,把这段代码改写一下,具体如何使用责任链模式,已经超出本文的范畴,感兴趣的话,去看一下讲设计模式的文章吧。

 

 

2
1
分享到:
评论
1 楼 TonyLian 2016-02-05  
无意中翻出这篇老博文,文章中留下的遗憾“纯JSP如何获取request”早已“破解”

    // 要在web.xml增加如下监听器:
    // <listener>
    //	<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    // </listener>
    request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();


而且,当if/else if太多了以后,这么写真的不太雅观。

因此,我推荐采用“责任链模式”,把这段代码改写一下,具体如何使用责任链模式,已经超出本文的范畴,感兴趣的话,去看一下讲设计模式的文章吧。

相关推荐

    spring mvc中启动netty

    编写一个`SpringMvcHandler`,它实现了`ChannelInboundHandlerAdapter`,并将Netty接收到的HTTP请求转化为Spring MVC的`HttpServletRequest`和`HttpServletResponse`对象,然后调用相应的Controller方法。...

    spring-web和spring-webmvc_4.2.4

    1. **Servlet API集成**:`spring-web`提供了对Servlet API的封装,如`HttpServletRequest`和`HttpServletResponse`的包装类,使得开发者可以更方便地处理HTTP请求和响应。 2. **WebSocket支持**:它提供了...

    org.springframework.web的jar包.zip

    《Spring框架Web模块详解——聚焦于WebSocket服务器端点支持》 在Java开发领域,Spring框架以其强大的功能和灵活的设计闻名,而`org.springframework.web`包是Spring框架中的一个重要部分,它提供了处理HTTP请求和...

    Spring Framework Reference 4.1.x Web MVC部分 pdf

    - **企业级Web应用**:由于其强大的灵活性和可扩展性,Spring Web MVC广泛应用于各种规模的企业级Web应用开发中。 - **RESTful服务**:利用Spring Web MVC提供的RESTful支持,可以快速构建出高性能的RESTful服务。 -...

    基于HttpServletRequest 相关常用方法的应用

    了解并熟练掌握这些`HttpServletRequest` 的常用方法,对于开发Java Web应用程序至关重要,它们能够帮助开发者有效地获取和处理客户端发送的信息,实现各种业务逻辑。在实际开发中,还可能需要结合Servlet规范、过滤...

    配置整合DWR3.0和Spring2.5使用annotation注解

    在本文中,我们将探讨如何将Direct Web Remoting (DWR) 3.0与...通过这种方式,DWR 3.0与Spring 2.5的整合使用注解配置简化了开发流程,使得Java后端的方法可以直接在客户端JavaScript中调用,实现前后端的无缝交互。

    android客户端与服务端交互简单登录实现

    2. 错误处理:客户端应能处理各种网络错误,如超时、无网络连接等,并向用户提供友好的提示。 3. 重试机制:当网络不稳定时,可以考虑加入重试机制,提高用户体验。 4. 状态管理:登录状态可以在客户端持久化,如...

    spring,获取IP.doc

    在 Spring 框架中,获取客户端 IP 地址是一个常见的需求,尤其是在处理网络请求时,我们需要知道请求来源的 IP 地址来实现如日志记录、安全控制等功能。Spring 提供了多种方式来获取请求中的 IP 地址。 首先,我们...

    利用spring security控制同一个用户只能一次登陆

    标题中的“利用Spring Security控制同一个用户只能一次登录”是指在基于Spring Security的Web应用程序中实现单点登录(Single Sign-On, SSO)的功能,确保同一时间只有一个设备或浏览器会话可以登录同一用户的账户。...

    spring,获取IP精选.doc

    1. **HttpServletRequest**: Spring MVC 中的 Controller 方法参数可以直接接受 `HttpServletRequest` 对象,然后通过 `request.getRemoteAddr()` 来获取 IP 地址。但需要注意,如果应用部署在反向代理(如 Nginx)...

    spring security 参考手册中文版

    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-...

    IP工具类,通过传入的request获取ip地址(JAVA)

    在上述代码中,`HttpServletRequest`的`getRemoteAddr()`方法用于获取客户端的IP地址。然而,如果应用部署在反向代理服务器(如Nginx)后,这个方法可能返回的是代理服务器的IP,而非实际用户的IP。这时,我们可以...

    spring与jquery ajax交互 和 servlet与jquery ajax交互

    在Spring MVC中,我们可以创建RESTful服务,通过HTTP的CRUD(Create, Read, Update, Delete)方法来处理客户端请求。例如,创建一个处理AJAX请求的Controller,定义一个`@RequestMapping`注解的方法,接收GET或POST...

    关于ip的过滤器 spring security例子

    本文将深入探讨如何在Spring Security中实现IP过滤器,以便控制访问应用的客户端IP地址。 首先,我们需要理解Spring Security的基本架构。它是一个多层次的组件模型,其中包括认证、授权和会话管理等核心功能。在...

    Java Spring Controller 获取请求参数的几种方法详解

    在Java Spring MVC框架中,Controller是处理HTTP请求的核心组件,它负责接收客户端发送的数据并进行业务逻辑处理。本文将详细讲解在Spring Controller中获取请求参数的六种常见方法。 1. **直接作为方法参数** 当...

    Spring MVC面试题(2022最新版)

    当控制器方法上标注了`@ResponseBody`时,Spring MVC会将方法的返回值直接序列化为JSON或XML格式,并作为HTTP响应体返回给客户端。前端可以通过AJAX技术(如jQuery的$.ajax()方法)发送异步请求,并处理后端返回的...

    spring boot 开发 servlet filters listeners

    ### Spring Boot 中 Servlet Filters 和 ...通过本篇文章的学习,相信你已经掌握了如何在 Spring Boot 应用中使用这些技术的基本方法。接下来,你可以尝试将它们应用到实际项目中,进一步提高应用的功能性和可维护性。

    Android客户端与服务器端通信Demo

    在Android应用开发中,客户端与服务器端的通信是不可或缺的一部分,它使得移动设备能够获取、发送数据,实现功能如登录注册、数据同步、文件上传下载等。本Demo着重展示了这一核心概念,通过实例来帮助开发者理解和...

    spring mvc 自學筆記

    这里提到的“验证单例多用构造方法”可能是指 Spring MVC 中单例 Bean 的生命周期问题。Spring 管理的 Bean 默认是单例模式,即在整个应用中只有一个实例。当 Bean 采用构造方法初始化时,无论多少次请求,构造函数...

Global site tag (gtag.js) - Google Analytics