工作原理
利用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”后就可以看到成果了
分享到:
相关推荐
Struts2Apache Struts2是一个优雅的,可扩展的JAVA EE web框架。框架设计的目标贯穿整个开发周期,从开发到发布,包括维护的整个过程。
Struts是Java Web开发中的一款经典MVC框架,它提供了处理用户请求、展现视图以及控制业务逻辑的能力。在这个场景中,我们关注的是如何在Struts框架中实现多张图片的上传功能。以下是对这个主题的详细解释: 1. **...
java struts2
Struts2是Java Web开发中一个非常流行的MVC框架,由Apache软件基金会维护。它提供了构建可维护、可扩展和高度模块化的Web应用程序的强大工具。本教程将带你深入理解Struts2的基础概念、核心组件以及如何快速入门。 ...
Java+Struts2 防盗链(Filter 不可过滤 Action) 防盗链是指防止在没有通过合理的登录界面,直接进入到系统中的机制。其优点是避免在每个页面判断是否获得 session,虽然在里也是判断是否或的 session,但是代码...
Struts2是一个强大的Java web应用程序框架,用于构建和部署可维护、高性能的Web应用程序。它在Web开发领域中被广泛使用,特别是在企业级应用中,因为它提供了MVC(Model-View-Controller)设计模式的实现,有助于...
在本项目中,我们关注的是Struts2中的图片上传功能,以及如何处理图片的大小和格式问题。这个压缩包包含了实现这些功能所需的jar文件和其他资源,例如TestUpload_Struts2项目。 首先,图片上传是Web应用中常见的...
这个项目"Java Struts2+poi插件 实现导出Excel"就是结合这两个工具,为用户提供一个功能,能够将数据导出到Excel格式的文件中。 首先,让我们详细了解一下Struts2。Struts2的核心是Action,它负责接收请求、处理...
在Struts2中实现图片添加水印的功能,可以为网站或应用提供版权保护,美观设计,或者增强品牌形象。以下是关于如何在Struts2中实现这一功能的详细步骤和知识点: 1. **添加单个文字水印** 要添加文字水印,首先...
Struts2是一个强大的Java web应用程序框架,用于构建和部署可维护、高性能的MVC(Model-View-Controller)架构的应用程序。在Web开发中,图片上传和预览是常见的功能需求,尤其对于用户交互丰富的应用来说。Struts2...
Struts2是一个强大的MVC(Model-View-Controller)框架,是Java Web开发中的重要工具。这个"Struts2的Java专题学习网"综合实训项目旨在帮助开发者深入理解和掌握Struts2框架,以及与之相关的Java、JSP技术在实际项目...
Struts2是一个强大的Java web应用程序开发框架,它基于Model-View-Controller(MVC)设计模式,用于构建可维护性高、结构清晰的企业级应用。这个"struts2完整的java代码"项目,提供了完整的前后台代码,对于学习和...
在Java开发中,Struts2是一个非常流行的MVC框架,用于构建企业级Web应用程序。它提供了丰富的功能,包括动作映射、拦截器、结果类型等,使得开发者能够更高效地组织和控制应用逻辑。本教程将详细介绍如何使用Java和...
在本文中,我们将深入探讨如何实现一个基于Java和Struts1框架的图片上传功能,结合SWFUpload这一前端上传插件。首先,我们要明白图片上传是Web应用中常见的一种功能,它涉及到前端交互、文件传输协议以及后端处理等...
Struts2是一个强大的Java web应用程序框架,用于构建和维护可扩展、结构清晰的MVC(Model-View-Controller)架构的Web应用。它基于Apache软件基金会的Jakarta Struts项目,旨在提供比其前身Struts1更为灵活和功能...
本文将深入探讨Struts2拦截器的原理以及它与Java中的动态代理之间的联系。 首先,让我们了解Struts2拦截器的基本工作原理。拦截器在Action执行前后被调用,形成一个拦截器链。每当一个HTTP请求到达,Struts2的...
在本主题"Servlet简单模拟Struts2"中,我们将探讨如何利用Servlet来实现类似Struts2框架的一些关键功能,包括请求拦截、XML配置解析、动态代理以及日志拦截。 首先,让我们了解一下Struts2框架的核心特性。Struts2...
Java Web整合开发是构建Web应用程序的关键技术,涵盖了Java语言、Eclipse集成开发环境(IDE)、Struts 2框架以及Ajax异步JavaScript和XML技术。这个主题深入探讨了这些技术如何协同工作,创建出高效、用户友好的Web...
Java Struts2 模板是基于Java的企业级Web应用程序开发框架,它提供了强大的MVC(模型-视图-控制器)架构来构建可扩展且维护性强的Web应用。Struts2框架是Apache软件基金会的开源项目,它继承了Struts1的优点,并结合...
Struts2是一个基于MVC(Model-View-Controller)设计模式的Java web应用程序框架,它在Java社区中广泛使用,特别是在构建企业级应用时。这个压缩包“Struts2jar”很可能包含了Struts2框架所需的各类JAR文件,这些...