shiro 静态页面资源不显示 解决方案(转)
最近做一个ssm+shiro的框架整和
不加shiro之前ssm中css和图片显示正常。加上以后无法显示。
解决方案:
shiro有静态资源过滤。
配置资源匿名访问即可
<property name="filterChainDefinitions">
<value>
/css/**= anon
/images/**= anon
/img/** =anon
/js/** =anon/login.jsp = anon # everything else requires authentication:
/** = authc
</span><span style="color: #0000ff;"></</span><span style="color: #800000;">value</span><span style="color: #0000ff;">></span>
<span style="color: #0000ff;"></</span><span style="color: #800000;">property</span><span style="color: #0000ff;">></span></pre>
配置成功还是无法显示
配置springMVC.xml
SpringMVC提供<mvc:resources>来设置静态资源,但是增加该设置如果采用通配符的方式增加拦截器的话仍然会被拦截器拦截,可采用如下方案进行解决:
方案一、拦截器中增加针对静态资源不进行过滤(涉及spring-mvc.xml)
1 <mvc:resources location="/" mapping="/**/*.js"/>
2 <mvc:resources location="/" mapping="/**/*.css"/>
3 <mvc:resources location="/assets/" mapping="/assets/**/*"/>
4 <mvc:resources location="/images/" mapping="/images/*" cache-period="360000"/>
5
6 <mvc:interceptors>
7 <mvc:interceptor>
8 <mvc:mapping path="/**/*"/>
9 <mvc:exclude-mapping path="/**/fonts/*"/>
10 <mvc:exclude-mapping path="/**/*.css"/>
11 <mvc:exclude-mapping path="/**/*.js"/>
12 <mvc:exclude-mapping path="/**/*.png"/>
13 <mvc:exclude-mapping path="/**/*.gif"/>
14 <mvc:exclude-mapping path="/**/*.jpg"/>
15 <mvc:exclude-mapping path="/**/*.jpeg"/>
16 <mvc:exclude-mapping path="/**/*login*"/>
17 <mvc:exclude-mapping path="/**/*Login*"/>
18 <bean class="com.luwei.console.mg.interceptor.VisitInterceptor"></bean>
19 </mvc:interceptor>
20 </mvc:interceptors>
方案二、使用默认的静态资源处理Servlet处理静态资源(涉及spring-mvc.xml, web.xml)
在spring-mvc.xml中启用默认Servlet
1 <mvc:default-servlet-handler/>
在web.xml中增加对静态资源的处理
1 <servlet-mapping>
2 <servlet-name>default</servlet-name>
3 <url-pattern>*.js</url-pattern>
4 <url-pattern>*.css</url-pattern>
5 <url-pattern>/assets/*"</url-pattern>
6 <url-pattern>/images/*</url-pattern>
7 </servlet-mapping>
但是当前的设置必须在Spring的Dispatcher的前面
方案三、修改Spring的全局拦截设置为*.do的拦截(涉及web.xml)
1 <servlet>
2 <servlet-name>SpringMVC</servlet-name>
3 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
4 <init-param>
5 <param-name>contextConfigLocation</param-name>
6 <param-value>classpath:spring-mvc.xml</param-value>
7 </init-param>
8 <load-on-startup>1</load-on-startup>
9 <async-supported>true</async-supported>
10 </servlet>
11 <servlet-mapping>
12 <servlet-name>SpringMVC</servlet-name>
13 <url-pattern>*.do</url-pattern>
14 </servlet-mapping>
这样设置,Spring就会只针对以'.do'结尾的请求进行处理,不再维护静态资源
针对这三种方案的优劣分析:
第一种方案配置比较臃肿,多个拦截器时增加文件行数,不推荐使用;第二种方案使用默认的Servlet进行资源文件的访问,Spring拦截所有请求,然后再将资源文件交由默认的Sevlet进行处理,性能上少有损耗;第三种方案Spring只是处理以'.do'结尾的访问,性能上更加高效,但是再访问路径上必须都以'.do'结尾,URL不太文雅;
综上所述,推荐使用第二和第三中方案
转载https://www.cnblogs.com/banning/p/6195072.html
博主用的是
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>SsmS</display-name>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
<welcome-file>index1.jsp</welcome-file> </welcome-file-list>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> <filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
springmvc.xml
<mvc:annotation-driven />
<mvc:default-servlet-handler /><span style="color: #008000;"><!--</span><span style="color: #008000;"> 静态资源过滤 </span><span style="color: #008000;">--></span>
<span style="color: #0000ff;"><</span><span style="color: #800000;">mvc:resources </span><span style="color: #ff0000;">location</span><span style="color: #0000ff;">="/resources/"</span><span style="color: #ff0000;"> mapping</span><span style="color: #0000ff;">="/resources/**"</span><span style="color: #0000ff;">/></span>
<span style="color: #0000ff;"><</span><span style="color: #800000;">mvc:resources </span><span style="color: #ff0000;">location</span><span style="color: #0000ff;">="/css/"</span><span style="color: #ff0000;"> mapping</span><span style="color: #0000ff;">="/css/**"</span><span style="color: #ff0000;"> cache-period</span><span style="color: #0000ff;">="2592000"</span><span style="color: #0000ff;">/></span>
<span style="color: #0000ff;"><</span><span style="color: #800000;">mvc:resources </span><span style="color: #ff0000;">location</span><span style="color: #0000ff;">="/img/"</span><span style="color: #ff0000;"> mapping</span><span style="color: #0000ff;">="/img/**"</span><span style="color: #ff0000;"> cache-period</span><span style="color: #0000ff;">="2592000"</span><span style="color: #0000ff;">/></span>
<span style="color: #0000ff;"><</span><span style="color: #800000;">mvc:resources </span><span style="color: #ff0000;">location</span><span style="color: #0000ff;">="/js/"</span><span style="color: #ff0000;"> mapping</span><span style="color: #0000ff;">="/js/**"</span><span style="color: #ff0000;"> cache-period</span><span style="color: #0000ff;">="2592000"</span><span style="color: #0000ff;">/></span>
<span style="color: #0000ff;"><</span><span style="color: #800000;">mvc:resources </span><span style="color: #ff0000;">location</span><span style="color: #0000ff;">="/images/"</span><span style="color: #ff0000;"> mapping</span><span style="color: #0000ff;">="/images/**"</span><span style="color: #ff0000;"> cache-period</span><span style="color: #0000ff;">="2592000"</span><span style="color: #0000ff;">/></span></pre>
重点来了困扰了三天
然而博主配置了shiro和springmvc后登录的静态页面是可以显示了
但是页面里边的样式无法显示,火狐控制台查看还是404。此去省略一万字。
解决办法:页面中的所有路径和请求都加上它 <%=request.getContextPath()%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/css/bootstrap.css">
<link href="<%=request.getContextPath()%>/css/common.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/css/jquery.datetimepicker.css"/>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/jquery.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/bootstrap.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/Validform_v5.3.2.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/jquery.datetimepicker.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/popwin.js"></script>
<%=request.getContextPath()%>
这篇博主写的不错转载:http://blog.csdn.net/u010010428/article/details/51246491
做的一个web项目,需要在jsp页面中获取js、css和图片等资源,本想采用相对路径来写,但是发现可移植性太差,在自己电脑上还好使,但辛辛苦苦调好代码后,放到其他电脑上又得再次辛辛苦苦修改相关路径。于是决定采用绝对路径来写。然后在网上找寻相关方法,发现用的比较多的两个:${pageContext.request.contextPath}和<%=request.getContextPath()%>,但具体用哪个我也不大清楚,于是继续查找两者的区别,但让我郁闷的是,网上“抄袭”的真多啊!而且说了一大堆!尽是些不痛不痒的专业名词,关键的真没几个!所以我决定靠自己理解,现在明白了!我想用一种比较通俗的语言分享一下我对此的认识!
可以说${pageContext.request.contextPath}等价于<%=request.getContextPath()%>!它们的意思就是取得当前项目名称(或者是--取出部署的应用程序名,不过这么说太官方了,试问有多少人知道“取出部署的应用程序名”的义)
那么什么是当前的项目名称呢?
假定你的web应用名称为hotel,这个hotel就是当前的项目名称,不过你在浏览器中输入请求路径时,例如输入http//:localhost:8080/hotel/login.jsp
${pageContext.request.contextPath}或<%=request.getContextPath()%>就是从这个请求路径(URL)上截取(是截取) /hotel ,看清楚,前面是有"/",而这个“/”代表的是"http//:localhost:8080",看清楚这里是没有"/"的!
对应到真是的物理地址,即为图中WebContent目录!
另外,如果你是在Tomcat的server.xml文件中配置了虚拟目录,例如
那么我们在对应的物理目录F:\javaweb中创建test_jsp.jsp文件,内容为
开启Tomcat,进行测试,发现输出结果为
可以看到,此时输出为虚拟目录,并且二者完全等价!
因此,在表单<formaction="${pageContext.request.contextPath}/hotel/login.jsp">中,这样写路径永远对,翻译过来${pageContext.request.contextPath}/hotel/login.jsp其中的含义,就是http//:localhost:8080/hotel/login.jsp,相当于你写了一全路径!当然前提是你的JSP页面等等必须放置的位置正确才可以,所以才说明路径永远正确。
为什么这么要做呢?因为学过一些MVC模式的程序员都知道,JSP的作用是用来显示的(表现的),其他的作用最好不要在这个页面上显示,尤其是Java代码!所以就用EL表达式来替代类似有“<%%>”这样的代码格式。
shiro 静态页面资源不显示 解决方案(转)的更多相关文章
- web静态页面资源访问路径问题
我使用的是idea,今天搭建一个项目时遇见了css和js路径错误,导致浏览器获取不到资源路径 这是我最开始写的路径 <link href="/main/loginMain.css&qu ...
- KindEditor放在包含模版页的页面里不显示解决方案
由于用了母版页,内容页服务器控件(是服务器控件哦)的id会被重写,我这里运行中查看源代码,控件的id变成了“ContentPlaceHolder1_content1”. <asp:TextBox ...
- 浅谈在静态页面上使用动态参数,会造成spider多次和重复抓取的解决方案
原因: 早期由于搜索引擎蜘蛛的不完善,蜘蛛在爬行动态的url的时候很容易由于网站程序的不合理等原因造成蜘蛛迷路死循环. 所以蜘蛛为了避免之前现象就不读取动态的url,特别是带?的url 解决方案: 1 ...
- Spring Security自定义认证页面(动态网页解决方案+静态网页解决方案)--练气中期圆满
写在前面 上一回我们简单分析了spring security拦截器链的加载流程,我们还有一些简单的问题没有解决.如何自定义登录页面?如何通过数据库获取用户权限信息? 今天主要解决如何配置自定义认证页面 ...
- 用手机自带uc浏览器查看静态页面,css样式不显示
问题描述: 这个问题是一个同事在写手机页面用UC浏览器测试以后遇到的,其他浏览器静态页面显示正常,唯独UC浏览器不显示页面样式. 我测试过代码是没有问题的,因为临时没有找到安卓手机,就猜想PC端的应该 ...
- DataTables学习:从最基本的入门静态页面,使用ajax调用Json本地数据源实现前端开发深入学习,根据后台数据接口替换掉本地的json本地数据,以及报错的处理地方,8个例子(显示行附加信息,回调使用api,动态显示和隐藏列...),详细教程
一.DataTables 个人觉得学习一门新的插件或者技术时候,官方文档是最根本的,入门最快的地方,但是有时候看完官方文档,一步步的动手写例子,总会出现各种莫名其妙的错误,需要我们很好的进行研究出错 ...
- 【spring】ApplicationListener传递参数到页面(解决静态+动态资源路径+静态文件的缓存控制)
一.相对路径还是绝对路径的问题 前端页面加载资源或者请求的时候到底是使用相对路径还是绝对路径,想必大家都很清楚,用的是当然是相对路径,因为这样增加了项目的灵活性,不需要经常的改动.那既然是相对路径就需 ...
- `<jsp:getProperty>`动作和`<jsp:setProperty>`动作的使用在一个静态页面填写图书的基本信息,页面信息提交给其他页面,并且在其页面显示。要去将表单元素的值赋值给Java
<jsp:getProperty>动作和<jsp:setProperty>动作的使用 1.<jsp:getProperty>动作 语法格式: <jsp:get ...
- 浅谈php生成静态页面
一.引 言 在速度上,静态页面要比动态页面的比方php快很多,这是毫无疑问的,但是由于静态页面的灵活性较差,如果不借助数据库或其他的设备保存相关信息的话,整体的管理上比较繁琐,比方修改编辑.比方阅读权 ...
随机推荐
- android 图片特效处理之锐化效果
这篇将讲到图片特效处理的锐化效果.跟前面一样是对像素点进行处理,算法是通用的. 算法原理: 一.简单算法:分别获取当前像素点和八个周围像素点的RGB值,先求出当前像素点的RGB值与八个像素点RGB值的 ...
- 通过js动态创建button
通过js动态创建button 一.实例描述 通过JS的DOM对象,实现元素的动态创建. 二.效果 三.代码 <!DOCTYPE html> <html lang="zh-c ...
- js关于循环的理解
学习任何语言都离不开循环,js也是一样,看了网上的资料,整理一份关于js循环的理解. 1.最基础循环,js和其他高级语言一样使用for.while循环 (function() { for(var i= ...
- HTML 页面内容禁止选中
写一个小笔记,怎么禁止HTML页面不被选中,复制. CSS: *{ moz-user-select: -moz-none; -moz-user-select: none; -o-user-select ...
- 【Django】ContentType组件
目录 理解 表结构 使用 @ 好,现在我们有这样一个需求,我们的商城里有很多的商品,然而节日要来了,我们要搞活动. 那么,我们就要设计优惠券,优惠券都有什么类型呢?满减的.折扣的.立减的.等等等... ...
- 小米开源文件管理器MiCodeFileExplorer-源码研究(2)-2个单实例工具类
从本篇开始,讲解net.micode.fileexplorer.util工具包中的类.这个包下的类,功能也比较单一和独立.很多代码的思想和实现,可以用于JavaWeb和Android等多种环境中. 一 ...
- 如何优雅的写UI——(4)选项卡美化
现在做出来的选项卡实在太丑的,咱们怎么把他弄得好看一点呢 tabctrl是可以添加icon图标的,那派生与tabctrl的mfctabctrl肯定也能添加图标,他们两个添加图标的原理一样,但是还是有点 ...
- linux6.0系统如何安装portmap
因为在6.0的系统里,portmap已经改名了.在Redhat或CentOS5中可以使用 service portmap start启动服务,然后在启动nfs服务,实现挂载. 6里面可是试试 serv ...
- 史上最简单,js并获取手机型号
原先获取不了苹果系列的型号,但转换思路,先推断是否是苹果,再用分辨率获取型号 //获取手机型号函数begin function getPhoneType(){ //正则,忽略大写和小写 var pa ...
- eclipse-ubuntu14.04图标替换不掉的问题
今天安装14.04的时候,遇到了一个问题.就是eclipse安装好以后,发现需要配置ADT,老是配置失败.后来实在没有办法了,所以就把这个eclipse跟删除了(当时它并没有安装,而是仅仅解压以后双击 ...