2019独角兽企业重金招聘Python工程师标准>>>

工作原理

利用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("."));// 得到访问的IPString reqIp = IpUtils.getIpAddr(request);System.out.println("img : " + imgPath + fileType);System.out.println("ip : " + reqIp);// 的到允许的IP的Mapif ("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”后就可以看到成果了

转载于:https://my.oschina.net/u/3647620/blog/1552469

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

  1. Nginx优化与防盗链(隐藏版本号、配置缓存时间、日志分割、修改进程数、配置连接超时、使用gzip压缩页面、防盗链设置,fpm优化)

    文章目录 隐藏Nginx版本号 网页压缩 网页压缩配置 网页缓存时间 网页缓存时间设置 更改Nginx运行进程数 连接超时 nginx防盗链设置 盗链网站 配置httpd 日志分割 fpm参数优化 隐 ...

  2. 华为云 obs 文件上传 及防盗链设置有效时间访问链接

    华为官方文档位置 本文适合小白和新手 ,仅满足基本文件上传 和 访问 maven引入华为云 obs jar文件 <dependency><groupId>com.huaweic ...

  3. JAVA防盗链在报表中的应用实例

    今天我们来聊聊Java防盗链,多说无用,直接上应用案例. 这里所用的工具是报表软件FineReport,搭配有决策系统(一个web前端展示系统,主要用于权限控制),可以采用java防盗链的方式来实现页 ...

  4. java 微信图片反盗链_详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案...

    已经获取微信公众号发布的图片,但不能正常显示 ,提示:此图片来自微信公众平台 未经允许不得引用. 这是怎么回事呢? 遇到这种问题是因为微信公众平台对图片采用了防盗链设置,微信对外提供了API接口,让我 ...

  5. java防盗链_javaWeb防止恶意登陆或防盗链的使用

    使用场景:明明引用了一个正确的图片地址,但显示出来的却是一个红叉或写有"此图片仅限于***网站用户交流沟通使用"之类的"假图片".用嗅探软件找到了多媒体资源的真 ...

  6. Nginx设置图片防盗链(白名单与黑名单)

    点击蓝字关注这个神奇的公众号- 某些时候可能您会发现,别人网站直接将您的网站图片拿过去使用,导致额外消耗服务器流量和带宽,如果本身服务器带宽和流量就比较小,被人盗链后势必会造成一定影响.这篇文章分享下 ...

  7. Nginx配置防盗链

    Nginx配置防盗链 进入Nginx配置文件: [root@LHQ vhosts]# vim test.conf server { listen 80; server_name www.test.co ...

  8. WordPress 图片防盗链的方法

    现在写博,为了达到图文并茂.增加视觉效果,往往都会把一些图片放在文章里面,这样一来,就涉及到三个方面的问题,一个是存储空间,二是流量,三是 访问及加载速度.随着国内带宽的不断升级,访问及加载已不是什么 ...

  9. 发力区块链,百度险中求胜 |链捕手

    在BAT的长期竞争中,百度的落伍已然是不争的事实.在错过移动互联网的船票后,百度正在尽可能地去把握未来科技竞争的制高点,人工智能是百度关键技术之一,区块链同样也是. 长期以来,百度在区块链方向的投入都 ...

最新文章

  1. 使用Relay部署编译ONNX模型
  2. python零基础怎么学-零基础python入门分析,如何做到一个月学会(深思极恐)
  3. tab选项卡在鼠标经过时实现切换延迟
  4. Mysql当前模式让不记录日志_终于有人把MySQL 三大日志讲清楚了
  5. When 多模态 meets 信息抽取
  6. cache性能分析实验 北邮_北邮人又获奖啦快来点赞!
  7. BMVC2018图像检索论文—使用区域注意力网络改进R-MAC方法
  8. C# winform 中MessageBox用法大全(附效果图)
  9. js获取多叉树的广度和深度
  10. kafka分布式集群的操作
  11. 工厂不存在导致的采购订单无法修改报错处理
  12. nodejs websocket 并发调试笔记
  13. python \xe6\xb5解码
  14. GIF录制神器--GIF123
  15. 服务器、存储和网络设备介绍
  16. 单片机胡汉才第四版答案_单片机课后习题答案__胡汉才编
  17. 模块加载失败请确保该二进制存储在指定路径中
  18. 设置共享文件夹之Mac技巧
  19. 华为 鸿蒙 腾讯,高通都已支持华为鸿蒙,小米、OV却无动于衷
  20. Java并发编程实战——显示锁

热门文章

  1. TFS命令tf:undo - 强制签入别人签出的文件
  2. 去掉主页 breadcrumb导航条上的Liferay字样
  3. javascript基础语法——变量和标识符
  4. C#使用sqlite的遇到的问题
  5. 编译安装openresty+mariadb+php7
  6. linux 技巧:使用 screen 管理你的远程会话
  7. [C#]从URL中获取路径的最简单方法-new Uri(url).AbsolutePath
  8. PowerShell2.0之桌面计算机维护(九)磁盘管理
  9. oracle 10g安装
  10. 浅析微信支付:开发前的准备