一般的文章都有 文本内容 和图片的。我想实现一个图片服务(或服务器)来单独处理图片逻辑,和文章处理逻辑分离。于是我想到一个办法,来尝试。

背景:

1. 假如文章的处理在web App,就叫web1 吧。那个图片理应存放在这个app的某个文件夹下,比如路径应该为: http://localhost:8080/web1/img/1.jpg,理应在这个网站的img文件夹下有某个图片,实际是没有的。

2. 我们实现图片逻辑的分离,新建一个web app,就叫web2吧,web2里处理所有的图片服务。某个图片的路径为:http://localhost:8080/web2/1.jpg。 图片存放在这里。

注意其中的差别和功能: web1是我们的处理文章的逻辑(可能是你的主网站),web2是图片服务。

思路:

1. 写一过滤器。实现转发,当一个路径,比如 http://localhost:8080/web1/img/1.jpg 这样的URL。理应在这个网站的img文件夹下有某个图片,实际是没有的。将来自 img/*下的所有图片请求,转发到 图片服务 下。

代码:

package zyf.demo;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.jasper.tagplugins.jstl.core.Out; /**
* Servlet Filter implementation class ImageFilter
*/
@WebFilter(filterName="ImageFilter",urlPatterns="/img/*")
public class ImageFilter implements Filter { /**
* Default constructor.
*/
public ImageFilter() {
// TODO Auto-generated constructor stub
} /**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
} /**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here // pass the request along the filter chain
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
String contextPath = req.getContextPath()+"/img/";
String requestURI = req.getRequestURI();
String imageName = requestURI.substring(requestURI.indexOf(contextPath)+contextPath.length()); System.out.println("str1: "+imageName);
System.out.println("getContextPath: "+req.getContextPath());
System.out.println("getRequestURI: "+req.getRequestURI());
System.out.println("getRequestURL: "+ req.getRequestURL());
System.out.println("getPathInfo: "+ req.getPathInfo()); if (imageName != null && !"".equals(imageName)) {
ServletContext context2 = request.getServletContext().getContext("/web2"); String newPath = "/xxx.jpg";
RequestDispatcher requestDispatcher;
requestDispatcher = context2.getRequestDispatcher(newPath);
requestDispatcher.forward(req, resp);
return;
}
chain.doFilter(request, response);
} /**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
} }

2.在图片服务下,准备图片,处理具体的图片提供(根据业务需要处理缓存,转换等)。

需要解决的问题:跨域访问问题

正常情况下,是无法跨域访问的。需要配置 context.xml的跨域访问。方法:

omcat默认不能跨WebApp进行访问

[解决]:
%TOMCAT_HOME%/conf/context.xml的Context中的属性crossContext="true"。 完整的context.xml内容如下:
<Context crossContext="true">

提供演示源代码下载

http://yunpan.cn/QN3XnTDxVIJtV 访问密码 3f63

参考:

http://blog.csdn.net/qfs_v/article/details/2551762

http://mn960mn.blog.163.com/blog/static/1141030842011020112410281/

http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContext.html

servlet 过滤器实现 请求转发(跳转);跨域转发请求;tomcat 环境下。的更多相关文章

  1. 004. 前端跨域资源请求: JSONP/CORS/反向代理

    1.什么是跨域资源请求? https://www.cnblogs.com/niuli1987/p/10252214.html 同源: 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有 ...

  2. Nginx转发地址解决跨域问题

    什么是跨域问题 在一个服务器A里放置了json文件,另一个服务器B想向A发送ajax请求,获取此文件,会发生错误. Chrome提示: XMLHttpRequest cannot load ***** ...

  3. 前后端分离下的跨域CAS请求

    最重要的两点: ajax请求跨域的时候,默认不会携带cookie. 请求分为普通请求(HttpRequest)和Ajax请求(XMLHttpRequest) 先屡一下跨域CAS认证的流程: 前端发起a ...

  4. 跨域post请求实现方案小结--转

    [名词解释] 跨域:https://developer.mozilla.org/en-US/docs/JavaScript/Same_origin_policy_for_JavaScript 同源策略 ...

  5. 跨域 HTTP 请求

    如果你需要从不同的服务器(不同域名)上获取数据就需要使用跨域 HTTP 请求. 跨域请求在网页上非常常见.很多网页从不同服务器上载入 CSS, 图片,Js脚本等. 在现代浏览器中,为了数据的安全,所有 ...

  6. 跨域Ajax请求WebService方法

    一.允许跨域Ajax请求,更改如下配置: 在要调用的WebService上面添加特性标签: 二.以如下返回用户信息的WebService方法为例 三.在另一个网站上通过Ajax访问webService ...

  7. 使用$.getJSON实现跨域ajax请求

    jQuery中常用getJSON来调用并获取远程的JSON字符串,将其转换为JSON对象,如果成功,则执行回调函数.原型如下: jQuery.getJSON( url, [data], [callba ...

  8. JSONP、图片Ping、XMLHttpRequest2.0等跨域资源请求(CORS)

    跨域:当协议.主域名.子域名.端口号中任意一个不相同时都不算同一个域,而在不同域之间请求数据即为跨域请求.解决方法有以下几种(如有错误欢迎指出)以请求图片url为例: 1.通过XMLHttpReque ...

  9. 【笔记】vue-cli 开发环境中跨域连接后台api(vue-resource 跨域post 请求)

    在vue-cli 项目中很多人会用到mock 数据(模拟数据),但是我觉得如果在真实的数据库交互中开发会更有安全感一些,所以查了一下百度很多人推荐的就是: 跨域! 跨域是什么概念?不同的主机名,同主机 ...

随机推荐

  1. 上传下载 demo

    import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.springf ...

  2. php分享十三:mysql事物

    一:事物的隔离级别 1:隔离级别的类型 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的: Read Uncommitted(读取未提交内容) Re ...

  3. 两table水平滚动条级联滚动(同步滚动)。 table1放标题,table2放内容。

    //table1=head和table2=body水平滚动条级联滚动 $(document).ready(function () { $("#bodyPanel").scroll( ...

  4. mybatis一对一和一对多实例

    一对一:<association></association> 一对多:<collection></collection> ClassMapper.xm ...

  5. [LeetCode] Read N Characters Given Read4 I & II

    Read N Characters Given Read4 The API: int read4(char *buf) reads 4 characters at a time from a file ...

  6. 【Unity】3.2 利用预设(Prefab)制作可复用的组件

    分类:Unity.C#.VS2015 创建日期:2016-04-02 一.简介 预制体(Prefab,也叫预设)是"存储在工程视图(Project View)中"的一种特殊的资源, ...

  7. FFmpeg(5)-AVStream和AVCodecParameters部分参数分析

    一.AVStream AVCodecContext *codec // 已过时,使用另一个 codecpar 结构体代替. AVRational time_base // 时间基数. int64_t ...

  8. cmd命令操作Oracle数据库

    //注意cmd命令执行的密码字符不能过于复杂 不能带有特殊符号 以免执行不通过 譬如有!@#¥%……&*之类的  所以在Oracle数据库设置密码是不要太复杂 /String Database ...

  9. angular学习笔记(三十)-指令(7)-compile和link(3)

    本篇接着上一篇来讲解当指令中带有template(templateUrl)时,compile和link的执行顺序: 把上一个例子的代码再进行一些修改: 1.将level-two指令改成具有templa ...

  10. Linux/CentOS关闭图形界面(X-window)和启用图形界面命令

    1.在图像界面关闭x window:1.1 shell中运行 init 3  进入文本模式,同时会关闭相关的服务(Xserver 肯定关闭)1.2 Alt+Ctrl+F1~F6到字符界面,root登陆 ...