`
songylwq
  • 浏览: 129766 次
  • 性别: Icon_minigender_1
  • 来自: 济南
文章分类
社区版块
存档分类
最新评论

java struts2模拟百度百科图片中的防盗链设置

 
阅读更多

工作原理

利用strust2的action通配对保护的图片得到后返回流文件,如果目录下没有找到图片,则返回未找到图片提示;对请求的IP进行对比,如果不在允许的IP列表时则返回没有权限的图片。


首先在struts.properties文件中添加查询后缀,struts的默认为action,可以添加多个,中间用“,”隔开

struts.i18n.encoding = UTF-8
struts.action.extension = html,jpg
struts.devMode=true
struts.custom.i18n.resources=messageResource
struts.locale=zh_CN
struts.multipart.saveDir=javax.servlet.context.tempdir
struts.ui.theme=simple
struts.enable.DynamicMethodInvocation=true

添加action类Test,其中有两个属性:String contentType,InputStream bis,前者是制定输出的流文件类型,后一个是文件流

package test.com.eca.service;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;

import main.com.eca.util.JsonUtil;

import org.apache.struts2.ServletActionContext;
import org.nail.common.BaseAction;

import com.opensymphony.xwork2.Action;

public class Test extends BaseAction {
	private BufferedOutputStream bos = null;
	private BufferedInputStream bis = null;
	private String imgPath;
	private String contentType;

	public String testImg() throws Exception {
		HttpServletRequest request = ServletActionContext.getRequest();

		System.out.println("request.getHeader(\"user-agent\")"
				+ request.getHeader("user-agent"));
		System.out.println("请求来源于浏览器 :"+BrowseTool.checkBrowse(request.getHeader("user-agent")));

		// 访问图片后缀
		StringBuffer requestUrl = request.getRequestURL();
		String fileType = requestUrl.substring(requestUrl.lastIndexOf("."));

		// 得到访问的IP
		String reqIp = IpUtils.getIpAddr(request);
		System.out.println("img : " + imgPath + fileType);
		System.out.println("ip : " + reqIp);
		// 的到允许的IP的Map
		if ("127.0.0.1".equals(reqIp)) {
			bis = new BufferedInputStream(new FileInputStream(
					"D:/images/no_acc_image.jpg"));
			return Action.SUCCESS;
		}
		// 判断是否有权限

		try {
			try {
				bis = new BufferedInputStream(new FileInputStream("D:/images/"
						+ imgPath + fileType));
			} catch (Exception e) {
				// e.printStackTrace();
				bis = new BufferedInputStream(new FileInputStream(
						"D:/images/no_image.jpg"));
			}

		} catch (final IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return Action.SUCCESS;
	}

	public static void main(String[] args) throws Exception {
		System.out.println("abcds".substring("abcds".indexOf("c")));
	}

	public BufferedOutputStream getBos() {
		return bos;
	}

	public void setBos(BufferedOutputStream bos) {
		this.bos = bos;
	}

	public BufferedInputStream getBis() {
		return bis;
	}

	public void setBis(BufferedInputStream bis) {
		this.bis = bis;
	}

	public String getImgPath() {
		return imgPath;
	}

	public String getContentType() {
		return contentType;
	}

	public void setContentType(String contentType) {
		this.contentType = contentType;
	}

	public void setImgPath(String imgPath) {
		this.imgPath = imgPath;
	}

}

/**
 * 
 * @author cc 20120307
 */
class BrowseTool {
	private final static String IE5_5 = "MSIE 5.5";
	private final static String IE9 = "MSIE 9.0";
	private final static String IE8 = "MSIE 8.0";
	private final static String IE7 = "MSIE 7.0";
	private final static String IE6 = "MSIE 6.0";
	private final static String MAXTHON = "Maxthon";
	private final static String QQ = "QQBrowser";
	private final static String GREEN = "GreenBrowser";
	private final static String SE360 = "360SE";
	private final static String FIREFOX = "Firefox";
	private final static String OPERA = "Opera";
	private final static String CHROME = "Chrome";
	private final static String SAFARI = "Safari";
	private final static String OTHER = "其它";

	public static String checkBrowse(String userAgent) {
		if (regex(OPERA, userAgent)) {
			return OPERA;
		} else if (regex(CHROME, userAgent)) {
			return CHROME;
		} else if (regex(FIREFOX, userAgent)) {
			return FIREFOX;
		} else if (regex(SAFARI, userAgent)) {
			return SAFARI;
		} else if (regex(SE360, userAgent)) {
			return SE360;
		} else if (regex(GREEN, userAgent)) {
			return GREEN;
		} else if (regex(QQ, userAgent)) {
			return QQ;
		} else if (regex(MAXTHON, userAgent)) {
			return MAXTHON;
		} else if (regex(IE9, userAgent)) {
			return IE9;
		} else if (regex(IE8, userAgent)) {
			return IE8;
		} else if (regex(IE7, userAgent)) {
			return IE7;
		} else if (regex(IE6, userAgent)) {
			return IE6;
		} else if (regex(IE5_5, userAgent)) {
			return IE5_5;
		}
		return OTHER;
	}

	private static boolean regex(String regex, String str) {
		Pattern p = Pattern.compile(regex, Pattern.MULTILINE);
		Matcher m = p.matcher(str);
		return m.find();
	}
}

class IpUtils {
	public static String getIpAddr(HttpServletRequest request) {
		String ip = request.getHeader("X-Forwarded-For");
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("Proxy-Client-IP");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("WL-Proxy-Client-IP");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("HTTP_CLIENT_IP");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("HTTP_X_FORWARDED_FOR");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getRemoteAddr();
		}
		return ip;
	}
}

在actionContext.xml文件中加入bean配置:

<bean id="test" class="test.com.eca.service.Test"
		parent="baseAction" scope="prototype">
	</bean>


之后配置action配置

<package name="test" extends="struts-default" namespace="/images">
	<!-- 测试图片权限管理 -->
    <action name="*" class="test" method="testImg">
    	<param name="imgPath">{1}</param>
    	<result type="stream">   
	        <param name="contentType">image/jpeg</param>   
	        <param name="inputName">bis</param>
	        <!-- 指定下载的文件名   -->
	        <!--<param name="contentDisposition">filename="wjc_lgo.jpg"</param>-->
	        <!-- 指定下载文件时的缓冲大小   -->
	        <!--<param name="bufferSize">1024</param>-->
       </result>
    </action>
</package>

其中注意,namespace要加入“/”,否则输入地址“http://xxx/images/abc.jpg”则无法找到,平配置意思为地址路径为“http://xxx/images/”开头的,已“.jpg”结尾的所有的请求都转为处理。

例如:“http://xxx/images/abc.jpg”并将“imgPath”作为参数调用action的方法

inputName指定为action的文件流的名称

下载的文件名、缓冲区大小在此不配置也可以

完成后地址栏输入“http://192.168.2.15:5050/ecs/images/tomcat.jpg”后就可以看到成果了




分享到:
评论

相关推荐

    Struts2百度百科

    Struts2Apache Struts2是一个优雅的,可扩展的JAVA EE web框架。框架设计的目标贯穿整个开发周期,从开发到发布,包括维护的整个过程。

    java struts 实现上传多张图片

    Struts是Java Web开发中的一款经典MVC框架,它提供了处理用户请求、展现视图以及控制业务逻辑的能力。在这个场景中,我们关注的是如何在Struts框架中实现多张图片的上传功能。以下是对这个主题的详细解释: 1. **...

    java struts2

    java struts2

    java Struts2快速入门教程pdf

    Struts2是Java Web开发中一个非常流行的MVC框架,由Apache软件基金会维护。它提供了构建可维护、可扩展和高度模块化的Web应用程序的强大工具。本教程将带你深入理解Struts2的基础概念、核心组件以及如何快速入门。 ...

    java+struts2防盗链(filter不可过滤action).docx

    Java+Struts2 防盗链(Filter 不可过滤 Action) 防盗链是指防止在没有通过合理的登录界面,直接进入到系统中的机制。其优点是避免在每个页面判断是否获得 session,虽然在里也是判断是否或的 session,但是代码...

    struts2简单模拟

    Struts2是一个强大的Java web应用程序框架,用于构建和部署可维护、高性能的Web应用程序。它在Web开发领域中被广泛使用,特别是在企业级应用中,因为它提供了MVC(Model-View-Controller)设计模式的实现,有助于...

    struts2 图片上传,图片大小,图片格式

    在本项目中,我们关注的是Struts2中的图片上传功能,以及如何处理图片的大小和格式问题。这个压缩包包含了实现这些功能所需的jar文件和其他资源,例如TestUpload_Struts2项目。 首先,图片上传是Web应用中常见的...

    Java Struts2+poi插件 实现导出Excel

    这个项目"Java Struts2+poi插件 实现导出Excel"就是结合这两个工具,为用户提供一个功能,能够将数据导出到Excel格式的文件中。 首先,让我们详细了解一下Struts2。Struts2的核心是Action,它负责接收请求、处理...

    Struts2实现图片添加水印

    在Struts2中实现图片添加水印的功能,可以为网站或应用提供版权保护,美观设计,或者增强品牌形象。以下是关于如何在Struts2中实现这一功能的详细步骤和知识点: 1. **添加单个文字水印** 要添加文字水印,首先...

    struts2图片上传并预览

    Struts2是一个强大的Java web应用程序框架,用于构建和部署可维护、高性能的MVC(Model-View-Controller)架构的应用程序。在Web开发中,图片上传和预览是常见的功能需求,尤其对于用户交互丰富的应用来说。Struts2...

    Struts2的Java专题学习网

    Struts2是一个强大的MVC(Model-View-Controller)框架,是Java Web开发中的重要工具。这个"Struts2的Java专题学习网"综合实训项目旨在帮助开发者深入理解和掌握Struts2框架,以及与之相关的Java、JSP技术在实际项目...

    struts2完整的java代码

    Struts2是一个强大的Java web应用程序开发框架,它基于Model-View-Controller(MVC)设计模式,用于构建可维护性高、结构清晰的企业级应用。这个"struts2完整的java代码"项目,提供了完整的前后台代码,对于学习和...

    java+struts2实现图表显示

    在Java开发中,Struts2是一个非常流行的MVC框架,用于构建企业级Web应用程序。它提供了丰富的功能,包括动作映射、拦截器、结果类型等,使得开发者能够更高效地组织和控制应用逻辑。本教程将详细介绍如何使用Java和...

    图片上传成功实例java+struts1

    在本文中,我们将深入探讨如何实现一个基于Java和Struts1框架的图片上传功能,结合SWFUpload这一前端上传插件。首先,我们要明白图片上传是Web应用中常见的一种功能,它涉及到前端交互、文件传输协议以及后端处理等...

    Struts2框架 jar JAVA开发 Struts2.jar架包 Struts2开发实例

    Struts2是一个强大的Java web应用程序框架,用于构建和维护可扩展、结构清晰的MVC(Model-View-Controller)架构的Web应用。它基于Apache软件基金会的Jakarta Struts项目,旨在提供比其前身Struts1更为灵活和功能...

    Struts2 拦截器 和 Java 中的动态代理

    本文将深入探讨Struts2拦截器的原理以及它与Java中的动态代理之间的联系。 首先,让我们了解Struts2拦截器的基本工作原理。拦截器在Action执行前后被调用,形成一个拦截器链。每当一个HTTP请求到达,Struts2的...

    Servlet简单模拟Struts2

    在本主题"Servlet简单模拟Struts2"中,我们将探讨如何利用Servlet来实现类似Struts2框架的一些关键功能,包括请求拦截、XML配置解析、动态代理以及日志拦截。 首先,让我们了解一下Struts2框架的核心特性。Struts2...

    用案例学Java Web整合开发:Java+Eclipse+Struts 2+Ajax

    Java Web整合开发是构建Web应用程序的关键技术,涵盖了Java语言、Eclipse集成开发环境(IDE)、Struts 2框架以及Ajax异步JavaScript和XML技术。这个主题深入探讨了这些技术如何协同工作,创建出高效、用户友好的Web...

    java struts2 模板

    Java Struts2 模板是基于Java的企业级Web应用程序开发框架,它提供了强大的MVC(模型-视图-控制器)架构来构建可扩展且维护性强的Web应用。Struts2框架是Apache软件基金会的开源项目,它继承了Struts1的优点,并结合...

    java struts2 jar

    Struts2是一个基于MVC(Model-View-Controller)设计模式的Java web应用程序框架,它在Java社区中广泛使用,特别是在构建企业级应用时。这个压缩包“Struts2jar”很可能包含了Struts2框架所需的各类JAR文件,这些...

Global site tag (gtag.js) - Google Analytics