IDEA中静态资源过滤访问的问题
最近学习了过滤器,对于一个JavaWeb实现登陆,跳转首页,退出的功能。根据需求设计了拦截所有的资源访问,然后对于所有有关静态资源和登陆请求路径,首页的页面访问予以释放。但是在碰到静态资源释放的时候遇到了一些问题
问题描述
基于IDEA2021.3。对于静态资源的释放,我计划是在web路径下新建一个static静态资源文件夹,然后在过滤器中对于每一次请求进行拦截,包含static就释放请求,然后判断当前session的登陆状态,没有登陆,请求转发到登陆页。有登陆状态释放请求。我使用**req.getRequestURI();**来获取当前的访问路径。但是很奇怪的是,登陆页面上的静态资源都无法访问,例如,js,css,img等等,在没有配置过滤器的时候,完全可以访问,问题不出在页面。于是我上网查找相关帖子。
解决办法
背景:
相对路径和绝对路径, 这问题在原来的myeclipse或者eclipse中不是个大问题,因为在myeclipse或者eclipse中,项目通过tomcat发布都是发布到webapp目录下的,而在上传图片这种静态资源的时候,考虑到图片不能随着项目发布而消失,所以我们以前的解决方法就是在tomcat的webapp目录下建一个与项目同级的files文件夹,用于存储图片,excel,word等静态文件。这样的话就可以有效的避免在项目发布的过程中静态资源消失的问题。
但是换到idea中之后,由于在idea中,项目通过tomcat发布时,项目并不是存在tomcat里的,而是存在artifacts中的Output directory所对应的文件目录下。
所以用了绝对路径也找不到,用相对路径更加不对,花了很多时间。后来想到,既然路径可以自己定义那为什么不和以前一样放在tomcat的webapp下面呢,不仅熟悉,而且安全,可以控制权限,这里建议大家不要把项目代码或者静态资源放在服务器的C、D、E这种硬盘上,如果被黑客入侵那么资源就没了,tomcat的webapp目录可以设置访问修改权限所以比较安全。修改了项目发布的路径就简单了。
所以正确的做法如下:
*****事实上, 由于idea有个虚拟路径这种东西
正确的配置上的话, 如下图, 就可以访问静态资源等文件了
因此正确的步骤是:
在项目的入口请求中,也就是用户整个系统的入口页面跳转请求中获取服务器的根目录,可以使用request.getSession().getServletContext().getRealPath(“/”);这个方法拿到localhost:8080/项目名, 在这个地址下,接下来通过String 的indexOf()方法和subString()方法把项目名替换掉加上刚刚配置的 /files/… 就可以了, 这样图片或者其他的静态资源就正常的加载出来了。
//不推荐使用获取工程的根路径
String a = request.getRealPath("/")
//获取jsp的路径,这个方法比较好用,可以直接在servlet和jsp中使用
String b = request.getRealPath(request.getRequestURI());
//获取工程的根路径,这个方法比较好用,可以直接在servlet和jsp中使用
String c = request.getSession().getServletContext().getRealPath("/");
//获取工程classes 下的路径,这个方法可以在任意jsp,servlet,java文件中使用,因为不管是jsp,servlet其实都是java程序,都是一个 class。所以它应该是一个通用的方法。
String d = this.getClass().getClassLoader().getResource("").getPath();
System.out.println("a等于:"+a); //a等于:D:\idea\idea_project\javahou\out\artifacts\storeSystem_war_exploded\
System.out.println("b等于:"+b); //b等于:D:\idea\idea_project\javahou\out\artifacts\storeSystem_war_exploded\storeSystem\AdminProductServlet
System.out.println("c等于:"+c); //c等于:D:\idea\idea_project\javahou\out\artifacts\storeSystem_war_exploded\
System.out.println("d等于:"+d); //d等于:/D:/idea/idea_project/javahou/out/artifacts/storeSystem_war_exploded/WEB-INF/classes/
配置 tomcat 中的静态资源的上下文访问路径, 如下图:
首先, 在其他的工具中, 使用绝对路径或者相对路径, 就可以访问图片等静态资源, 在js或者jsp中最好直接使用绝对路径,这样会少掉很多问题。但是 idea中支持虚拟路径,专门用于访问静态资源,首先, 点开tomcat的配置, 进行如下的操作
在需要使用到静态资源的地方使用上图中配置的静态资源上下文路径再加上资源的相对路径即可, 如下图
总结
通过以上的步骤,我成功的解决了静态资源无法访问的问题。
简单的说,就是给自己的static静态资源文件夹在Tomcat中添加一个访问路径。然后改造页面访问路径,加上“/”改成相对
上边的内容转载自
IDEA中, web项目的img标签src的路径问题及静态资源加载路径问题