/** * Copyright (c) 2005-2009 springside.org.cn
* * Licensed under the Apache License, Version 2.0 (the "License");
* * $Id: Struts2Utils.java 463 2009-09-13 14:34:14Z calvinxiu $
*/
package org.grayrabbit.web.struts2;
import java.io.IOException; import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import net.sf.json.JSONObject;
import nl.bitwalker.useragentutils.UserAgent;
import org.apache.commons.lang.StringUtils;
import org.apache.struts2.ServletActionContext;
import org.grayrabbit.commons.util.logging.Logger;
import org.grayrabbit.commons.util.logging.LoggerFactory;
/** * Struts2 Utils类. * * 实现获取Request/Response/Session与绕过jsp/freemaker直接输出文本的简化函数.
* * @author sys53 */
public class Struts2Utils {
//header 常量定义//
private static final String ENCODING_PREFIX = "encoding";
private static final String NOCACHE_PREFIX = "no-cache";
private static final String ENCODING_DEFAULT = "UTF-8";
private static final boolean NOCACHE_DEFAULT = true;
//content-type 定义 //
private static final String TEXT = "text/plain";
private static final String JSON = "application/json";
private static final String XML = "text/xml";
private static final String HTML = "text/html";
private static Logger logger = LoggerFactory.getLogger(Struts2Utils.class);
// 取得Request/Response/Session的简化函数 //
/** * 取得HttpSession的简化方法. */
public static HttpSession getSession() {
return ServletActionContext.getRequest().getSession(); }
/** * 取得HttpRequest的简化方法. */
public static HttpServletRequest getRequest() {
return ServletActionContext.getRequest(); }
/** * 取得HttpResponse的简化方法. */
public static HttpServletResponse getResponse() {
return ServletActionContext.getResponse(); }
/** * 取得Request Parameter的简化方法. */
public static String getParameter(String name) {
return getRequest().getParameter(name); }
/** * 取得客户单IP地址 * * @return */
public static String getClientIp(){
String ip = ServletActionContext.getRequest().getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = ServletActionContext.getRequest().getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = ServletActionContext.getRequest().getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = ServletActionContext.getRequest().getRemoteAddr();
} if (ip.startsWith("0:0:0:0:0:0:0:1")) {
return "127.0.0.1";
} return ip;
}
/** * 取得客户端浏览器信息
* * @return */
public static UserAgent getUserAgent(){
return UserAgent.parseUserAgentString(ServletActionContext.getRequest().getHeader("User-Agent"));
}
/** * 取得客户端上次请求的URL地址
* * @return */
public static String getReferer(){
return ServletActionContext.getRequest().getHeader("Referer");
}
/** * 取得客户端请求的url地址 * * @return */
public static String getRequestUrl(){
return ServletActionContext.getRequest().getRequestURL().toString(); }
// 绕过jsp/freemaker直接输出文本的函数 //
/** * 直接输出内容的简便函数.
* eg. * render("text/plain", "hello", "encoding:GBK");
* render("text/plain", "hello", "no-cache:false");
* render("text/plain", "hello", "encoding:GBK", "no-cache:false");
* * @param headers 可变的header数组,目前接受的值为"encoding:"或"no-cache:",默认值分别为UTF-8和true. */
public static void render(final String contentType, final String content, final String... headers) {
try {
//分析headers参数
String encoding = ENCODING_DEFAULT;
boolean noCache = NOCACHE_DEFAULT;
for (String header : headers) {
String headerName = StringUtils.substringBefore(header, ":");
String headerValue = StringUtils.substringAfter(header, ":");
if (StringUtils.equalsIgnoreCase(headerName, ENCODING_PREFIX)) {
encoding = headerValue;
} else if (StringUtils.equalsIgnoreCase(headerName, NOCACHE_PREFIX)) {
noCache = Boolean.parseBoolean(headerValue);
} else
throw new IllegalArgumentException(headerName + "不是一个合法的header类型");
}
HttpServletResponse response = ServletActionContext.getResponse();
//设置headers参数
String fullContentType = contentType + ";charset=" + encoding;
response.setContentType(fullContentType);
if (noCache) {
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
}
response.getWriter().write(content);
response.getWriter().flush();
} catch (IOException e) {
logger.error(e.getMessage(), e);
} }
/** * 直接输出文本.
* @see #render(String, String, String...)
*/
public static void renderText(final String text, final String... headers) {
render(TEXT, text, headers); }
/** * 直接输出HTML. * @see #render(String, String, String...) */
public static void renderHtml(final String html, final String... headers) {
render(HTML, html, headers); }
/** * 直接输出XML. * @see #render(String, String, String...) */
public static void renderXml(final String xml, final String... headers) {
render(XML, xml, headers); }
/** * 直接输出JSON.
* * @param string json字符串.
* @see #render(String, String, String...)
*/
public static void renderJson(final String jsonString, final String... headers) {
render(JSON, jsonString, headers);
}
/** * 直接输出JSON.
* * @param map Map对象,将被转化为json字符串.
* @see #render(String, String, String...)
*/
public static void renderJson(@SuppressWarnings("rawtypes") final Map map, final String... headers) {
String jsonString = JSONObject.fromObject(map).toString();
render(JSON, jsonString, headers); }
/** * 直接输出JSON.
* * @param object Java对象,将被转化为json字符串.
* @see #render(String, String, String...)
*/
public static void renderJson(final Object object, final String... headers) {
String jsonString = JSONObject.fromObject(object).toString();
render(JSON, jsonString, headers);
} }
java 取得客户端上次请求的URL地址
最新推荐文章于 2019-08-19 15:10:52 发布