java伪静态--文件防盗链的实现 转

本文介绍了使用Java的UrlRewrite技术实现文件防盗链的方法,包括下载urlrewrite过滤器、配置urlrewrite.xml文件、实现防盗链功能等步骤,并通过实例展示了如何在网站中防止素材文件被非法盗链。

java伪静态--文件防盗链的实现 收藏
现在UrlRewriter技术有两个技术平台的,一个就是在Java方向的,另一个就是.NET方向的。这次是Java方向的应用。

首先让我们了解它的工作原理,说白了它就是一个简单的过滤器(Filter),看看源码你就会很快的明白,它就是通过我们在jsp中常用的两个方法实现的forward(),sendRedirect().

下面我们就快速的为你的网站搭建Url重写技术。

第一步:下载urlrewrite-2.6.0.现在最新版本是3.1的。(http://tuckey.org/urlrewrite/dist/urlrewritefilter-2.6.zip

http://urlrewritefilter.googlecode.com/files/urlrewritefilter-3.1.0.zip把urlrewrite-2.6.0.jar拷到classpath下。

第二步:在WEB-INF目录下建一个urlrewrite.xml文件。

第三步:在web.xml中初始化。加上下面的代码:

<!-- Set URL Rewrite-->

<filter>

<filter-name>UrlRewriteFilter</filter-name>

<filter-class>

org.tuckey.web.filters.urlrewrite.UrlRewriteFilter

</filter-class>

</filter>

<filter-mapping>

<filter-name>UrlRewriteFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

最后我要简单的讲一下常用的两个配置规则.以下就是简单的urlrewrite.xml配置片段。不要习惯Java的命名法把它写成urlRewrite.xml,这样即使你加上

<init-param>

<param-name>confPath</param-name>

<param-value>/WEB-INF/urlRewrite.xml</param-value>

</init-param>

在启动的服务器的时候还是会报错的,因为源码中必须是全小写的(urlrewrite.xml)且只能放到WEB-INF下面。

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 2.6//EN"

"http://tuckey.org/res/dtds/urlrewrite2.6.dtd">

<urlrewrite>

<rule>

<from>^/(\w+)/(\w+)/page_(\d+)\.html$</from>

<to type="forward">/$1.htm?category=$2&amp;page=$3</to>

</rule>

<rule>

<from>^/rss/yahoo\.html$</from>

<to type="redirect"> http://add.my.yahoo.com/rss? url=http://feed.feedsky.com/W3CSSiteFeed

</to>

</rule>

</urlrewrite>

所有的规则配置都写在这里。第一个常用个规则就是站内的简单重写。

 

<rule>

<from></from>

<to type="forward></to>

</rule>

<from></from>写上你自己定义的访问地址,<to type="forward></to>就是实际的访问地址。比如我们实际的访问地址是:http://baidu.com/entity.htm ?category=user&page=2.而我们想把它重写为http://baidu.com/entity/uesr/page_2.html。这样看起来比我们实际的要好看的多。我们就应该这样的写:

<rule>

<from>^/(\w+)/(\w+)/page_(\d+)\.html$</from>

<to type="forward">/$1.htm?category=$2&amp;page=$3</to>

</rule>

实例:文件防盗链的实现
  由于公司是做网站的,因此会有素材服务器,以前在网站中所有用到素材的地方都直接写的素材文件的绝对下载地址,因此素材的目录部署结构都被暴露在网络中,这样就出现了两个问题:

  1,素材服务器的目录结构部署很容易被人了解到.

  2,素材没有签权,容易被盗链

下面就试着实现了防盗链,以下是解决方案:

利用了urlrewriter和文件流输出解决了这个问题,

urlrewriter是url重新定向,把原有的符合某些规则的url定向到一个jsp,然后在这个jsp里实现签权 ,下面我们就一步一步实现这个防盗链

第一步:新建工程,引入依赖包,在本例子中需要引用urlrewrite-3.0.4.jar包


第二步:在web.xml中配置urlrewriter的过滤器,配置如下:

Web.xml代码

<?xml version="1.0" encoding="UTF-8"?>   
<web-app version="2.4"    
    xmlns="http://java.sun.com/xml/ns/j2ee"    
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee    
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">   
    <filter><!-- 配置urlRewriter过滤器 -->   
    <filter-name>UrlRewriteFilter</filter-name>   
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>   
    <init-param>   
      <description>是否可以重新载入</description>   
      <param-name>confReloadCheckEnabled</param-name>   
      <param-value>true</param-value>   
    </init-param>   
    <init-param>   
      <description>重新载入时间</description>   
      <param-name>confReloadCheckInterval</param-name>   
      <param-value>1800</param-value>   
    </init-param>   
  </filter>   
  <filter-mapping>   
    <filter-name>UrlRewriteFilter</filter-name>   
    <url-pattern>/*</url-pattern>   
    <dispatcher>REQUEST</dispatcher>   
    <dispatcher>FORWARD</dispatcher>   
  </filter-mapping>   
  <welcome-file-list>   
    <welcome-file>index.jsp</welcome-file>   
  </welcome-file-list>   
  
</web-app>  
<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4"

  xmlns="http://java.sun.com/xml/ns/j2ee"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

  http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

 

    <filter><!-- 配置urlRewriter过滤器 -->

    <filter-name>UrlRewriteFilter</filter-name>

    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>

    <init-param>

      <description>是否可以重新载入</description>

      <param-name>confReloadCheckEnabled</param-name>

      <param-value>true</param-value>

    </init-param>

    <init-param>

      <description>重新载入时间</description>

      <param-name>confReloadCheckInterval</param-name>

      <param-value>1800</param-value>

    </init-param>

  </filter>

  <filter-mapping>

    <filter-name>UrlRewriteFilter</filter-name>

    <url-pattern>/*</url-pattern>

    <dispatcher>REQUEST</dispatcher>

    <dispatcher>FORWARD</dispatcher>

  </filter-mapping>

  <welcome-file-list>

    <welcome-file>index.jsp</welcome-file>

  </welcome-file-list>

 

</web-app>


第三步:配置urlrewrite.xml,设置url转化规则

Urlrewrite.xml代码

<?xml version="1.0" encoding="utf-8"?>   
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 2.6//EN" "http://tuckey.org/res/dtds/urlrewrite2.6.dtd">   
<!--   
    Configuration file for UrlRewriteFilter   
    http://tuckey.org/urlrewrite/   
-->   
<urlrewrite>   
    <!-- 编写url转换规则,把所有mp3的访问全部都转移到downloadmp3.jsp进行处理 -->   
    <rule enabled="true">   
        <from>/mp3file/(.+)</from>   
        <to>/mp3/downloadmp3.jsp?file=$1</to>   
    </rule>   
</urlrewrite>  
<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 2.6//EN" "http://tuckey.org/res/dtds/urlrewrite2.6.dtd">

<!--

    Configuration file for UrlRewriteFilter

    http://tuckey.org/urlrewrite/

-->

<urlrewrite>

    <!-- 编写url转换规则,把所有mp3的访问全部都转移到downloadmp3.jsp进行处理 -->

  <rule enabled="true">

   <from>/mp3file/(.+)</from>

   <to>/mp3/downloadmp3.jsp?file=$1</to>

  </rule>

 

</urlrewrite>


第四步:编写文件下载签权使用的downloadmp3.jsp,代码如下

Downloadmp3.jsp代码

<%@page language="java"  pageEncoding="gb2312"%>      
<%@page import="java.io.FileInputStream"%>   
<%      
  //可以在这里先完成签权,检查该用户是否有资格进行mp3文件下载   
  //采用文件流输出的方式处理mp3下载:      
  String filename=request.getParameter("file");   
  response.reset();//可以加也可以不加      
  response.setContentType("audio/mpeg");//设置返回头类型       
  //设置下载时显示的文件名   
  response.addHeader("Content-Disposition","attachment;filename="+filename  );          
  java.io.OutputStream outp = null;      
  java.io.FileInputStream in = null;         
  //文件所在的真实路径   
  String realfilepath="D:\\y\\testdownload\\WebRoot\\mp3\\download\\";      
  try      
  {      
  outp = response.getOutputStream();   
  in = new FileInputStream(realfilepath+filename);      
  byte[] b = new byte[1024];      
  int i = 0;        
  while((i = in.read(b)) > 0)      
  {      
  outp.write(b, 0, i);      
  }         
  outp.flush();      
  out.clear();      
  out = pageContext.pushBody();      
  }      
  catch(Exception e)      
  {      
  System.out.println("Error!");      
  e.printStackTrace();      
  }      
  finally      
  {      
  if(in != null)      
  {      
  in.close();      
  in = null;      
  }        
  }      
%>    <%@page language="java"  pageEncoding="gb2312"%>   <%@page import="java.io.FileInputStream"%><%  
  //可以在这里先完成签权,检查该用户是否有资格进行mp3文件下载

  //采用文件流输出的方式处理mp3下载:  

  String filename=request.getParameter("file");

  response.reset();//可以加也可以不加  

  response.setContentType("audio/mpeg");   //设置返回头类型

 

  //设置下载时显示的文件名

  response.addHeader("Content-Disposition","attachment;filename="+filename  );  

 

  java.io.OutputStream outp = null;  

  java.io.FileInputStream in = null; 

 

  //文件所在的真实路径

  String realfilepath="D:\\y\\testdownload\\WebRoot\\mp3\\download\\";

  

  try  

  {  

  outp = response.getOutputStream();

  in = new FileInputStream(realfilepath+filename);  

 

  byte[] b = new byte[1024];  

  int i = 0;  

 

  while((i = in.read(b)) > 0)  

  {  

  outp.write(b, 0, i);  

  }    

  

  outp.flush();  

  out.clear();  

  out = pageContext.pushBody();  

  }  

  catch(Exception e)  

  {  

  System.out.println("Error!");  

  e.printStackTrace();  

  }  

  finally  

  {  

  if(in != null)  

  {  

  in.close();  

  in = null;  

 

  }  

 

  }  

%> 


OK,到此我们的文件防盗链功能也就完成了,你现在可以实现一下,在浏览器地址栏输入出mp3地址,就会被跳到filedown.jsp,你可以在downloadmp3.jsp中完成签权以及其它需要的工作,而且从用户体验来讲,他根本感觉不到这是在访问一个jsp,用户看到的还是在下功一个普通的mp3文件而已


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/lsbhjshyn/archive/2010/03/11/5370372.aspx

<think>嗯,用户想用Java和Spring Boot设计一个基于Web的豫剧在线平台,现在需要开始准备工作。首先,我得考虑豫剧平台的主要功能可能有哪些。用户可能希望有剧目展示、视频播放、用户互动、会员系统这些模块吧。然后技术选型方面,前端可能用Vue或者React,后端用Spring Boot,数据库可能用MySQL或者PostgreSQL,缓存用Redis,搜索用Elasticsearch,消息队列用RabbitMQ或者Kafka。这些技术组合起来应该能满足需求。 接下来是项目结构设计,标准的MVC模式应该可以,分成controller、service、repository层。或者用领域驱动设计,根据模块划分。可能需要模块化设计,比如用户模块、剧目模块、视频模块、论坛模块、支付模块等。这样结构清晰,维护起来也方便。 然后依赖管理需要用Maven或者Gradle,Spring Boot的版本要选稳定版的,比如2.7.x或者3.0.x。不过要注意Spring Boot 3.0需要Java 17,用户可能需要注意JDK版本的选择。 数据库设计方面,用户表、剧目表、视频表、评论表、订单表这些是基础。可能需要考虑视频存储,是否用本地存储还是云存储,比如阿里云OSS或者七牛云。视频播放的话,是否集成第三方服务如阿里云视频点播,或者自己处理码和流媒体传输。这部分可能比较复杂,需要评估时间和资源。 开发环境准备的话,JDK肯定要装,IDE用IntelliJ IDEA或者Eclipse,数据库工具如Navicat或者DBeaver。版本控制用Git,仓库可以用GitHub、GitLab或者Gitee。接口测试工具Postman或者Apifox,文档管理用Swagger或者Knife4j,方便前后端协作。 基础设施方面,可能需要注册域名,备案,购买云服务器,比如阿里云ECS或者腾讯云CVM,配置Nginx反向代理和SSL证书。持续集成可以用Jenkins或者GitHub Actions,Docker容器化部署,监控用Prometheus和Grafana,日志用ELK。这些都是需要考虑的。 另外,法律方面需要注意豫剧内容的版权问题,避免侵权。用户隐私保护要符合GDPR或中国网络安全法,特别是实名认证和支付安全。可能还需要办理ICP许可证,尤其是涉及在线支付的话。 原型设计工具如Axure或墨刀,UI设计用Figma或Sketch,测试工具JUnit、Mockito、Selenium。这些工具链的熟悉程度可能影响开发进度。 用户可能没提到的潜在需求,比如多语言支持,因为豫剧可能有不同地区的观众,或者移动端适配,是否需要开发响应式网页或者App。另外,视频版权管理和防盗链措施也很重要,防止资源被盗用。 可能遇到的问题包括视频流媒体的处理,高并发下的性能优化,支付接口的集成,以及用户生成内容的管理,比如评论审核机制。需要提前规划解决方案,比如使用CDN加速视频播放,分布式缓存减轻数据库压力,异步处理消息队列等。 总之,准备工作需要全面考虑功能需求、技术选型、开发环境、基础设施和法律合规等方面,确保项目顺利启动和后续开发的高效进行。</think>设计一个基于Java和Spring Boot的豫剧在线平台,需要从技术选型、功能规划到开发环境搭建等多方面进行准备。以下是详细步骤: --- ### **一、明确平台核心功能** 1. **用户模块** - 注册/登录(短信/邮箱验证) - 个人中心(收藏、观看历史) - VIP会员体系(付费订阅) 2. **豫剧内容模块** - 剧目分类(经典剧目、现代戏等) - 视频播放(支持高清/流畅切换) - 图文介绍(剧情、演员、历史背景) 3. **互动功能** - 评论/弹幕 - 社区论坛(戏迷交流) 4. **运营支持** - 后台管理系统(内容审核、数据统计) - 广告位管理 - 线上购票(线下演出联动) --- ### **二、技术选型建议** | **分类** | **技术栈** | **说明** | |----------------|-----------| | **后端框架** | Spring Boot 3.x + JDK 17 | 快速构建RESTful API,需注意Java版本兼容性 | | **数据库** | MySQL 8 + Redis | 业务数据存储 + 缓存优化(如会话、热点数据) | | **文件存储** | 阿里云OSS/腾讯云COS | 存储豫剧视频、海报等大文件,需集成CDN加速 | | **搜索优化** | Elasticsearch | 支持剧目名称、演员、台词的模糊搜索 | | **消息队列** | RabbitMQ/Kafka | 异步处理评论审核、通知推送等高延迟操作 | | **实时交互** | WebSocket/SockJS | 弹幕功能实现 | | **安全框架** | Spring Security + JWT | 用户鉴权、防CSRF攻击 | --- ### **三、项目初始化步骤** 1. **环境准备** - 安装JDK 17、Maven/Gradle - 配置IDE(IntelliJ IDEA推荐) - 安装Docker(用于本地MySQL/Redis环境) 2. **Spring Boot项目搭建** ```bash # 使用Spring Initializr生成项目 https://start.spring.io/ ``` - 依赖选择:Web, Security, Data JPA, MySQL, Redis, Validation 3. **多环境配置** ```yaml # application-dev.yml spring: datasource: url: jdbc:mysql://localhost:3306/yuju_db?useSSL=false username: root password: 123456 redis: host: localhost port: 6379 ``` 4. **代码规范** - 启用Checkstyle/PMD静态检查 - 使用Lombok简化POJO - 遵循Restful API设计规范(状态码、URI命名) --- ### **四、数据库设计示例** 1. **核心表结构** ```sql -- 用户表 CREATE TABLE `user` ( `id` BIGINT PRIMARY KEY AUTO_INCREMENT, `username` VARCHAR(50) UNIQUE NOT NULL, `encrypted_password` VARCHAR(100) NOT NULL, `phone` VARCHAR(20) COMMENT '手机号(实名认证)', `vip_expire` DATETIME COMMENT 'VIP到期时间' ); -- 剧目表 CREATE TABLE `drama` ( `id` BIGINT PRIMARY KEY AUTO_INCREMENT, `title` VARCHAR(100) NOT NULL, `summary` TEXT COMMENT '剧情简介', `cover_url` VARCHAR(255) COMMENT '封面图OSS地址' ); -- 视频分集表 CREATE TABLE `episode` ( `id` BIGINT PRIMARY KEY AUTO_INCREMENT, `drama_id` BIGINT NOT NULL, `episode_number` INT COMMENT '第几集', `video_url` VARCHAR(255) NOT NULL COMMENT '云存储地址', `duration` INT COMMENT '视频时长(秒)' ); ``` 2. **优化建议** - 垂直分库:用户数据与内容数据分离 - 水平分表:按年份拆分剧目表(如drama_2023) - 添加全文索引:针对剧目名称、唱词字段 --- ### **五、关键问题解决方案** 1. **视频播放性能** - 使用HLS协议实现自适应码率 ```java // 伪代码:视频码任务提交 @Async public void processVideo(File rawVideo) { // 调用FFmpeg生成多分辨率版本 // 上传至OSS并记录数据库 } ``` 2. **弹幕实时性** - 通过WebSocket广播消息 ```java @Controller @RequiredArgsConstructor public class DanmakuController { private final SimpMessagingTemplate messagingTemplate; @MessageMapping("/danmaku/send") public void sendDanmaku(DanmakuMessage message) { // 存储到数据库 danmakuService.save(message); // 广播到所有客户端 messagingTemplate.convertAndSend("/topic/danmaku", message); } } ``` 3. **版权保护** - 视频加水印(用户ID+时间戳) - 防盗链设置(OSS Referer白名单) - 关键API限流(Guava RateLimiter) --- ### **六、部署与运维** 1. **服务器架构** ``` 用户请求 → Nginx(负载均衡) → Spring Boot集群 │ ├─ MySQL主从复制 └─ Redis哨兵模式 ``` 2. **持续集成** ```yaml # GitHub Actions示例 name: Build & Deploy on: [push] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Build with Maven run: mvn clean package -DskipTests - name: Dockerize run: | docker build -t yuju-platform . docker-compose up -d ``` --- ### **七、法律合规注意** 1. 豫剧内容需取得版权方授权 2. 用户实名认证需符合《网络安全法》 3. 在线支付需接入微信/支付宝官方API 4. 若含用户上传内容,需实现敏感词过滤(集成阿里云内容安全API) --- 通过以上步骤的系统规划,可高效启动豫剧平台的开发。建议先实现核心功能MVP(如视频播放+基础评论),再逐步迭代社区、电商等模块。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值