更改静态资源过滤方式。

项目中,考虑了3种过滤资源方式。

1、在web.xml中过滤。

配置如下:

<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>
			org.springframework.web.servlet.DispatcherServlet
		</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>
				/WEB-INF/classes/mvc-config.xml
			</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
  </servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.json</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.xml</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.html</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.swf</url-pattern>
  </servlet-mapping>
  <!-- <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/dawson/metadata/*</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/ereading/metadata/*</url-pattern>
  </servlet-mapping> -->
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.css</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.xls</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.rar</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.zip</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.gif</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.jpg</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
  </servlet-mapping>
	<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.woff</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.ttf</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.eot</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.otf</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.svg</url-pattern>
	</servlet-mapping>

配置servlet-mapping,针对请求进行过滤和拦截。

拦截方式,针对请求,对后缀进行匹配。

*.js,*.css

以下部分为转载其他文章,帮助理解。

在Servlet容器中,只有servlet才能处理请求。比如在Tomcat容器中,即使是JSP,也会被编译成servlet,当访问静态资源,比如a.jpg的时候,也是由servlet来处理,在tomcat中,对于这种资源的处理servlet就是default,上面的这段配置,就是tomcat对静态资源的处理配置,该配置要写在DispatcherServlet的前面,让defaultServlet先于DispatcherServlet拦截生效。不同的servlet容器,处理静态资源的servlet的名字不太一样:Tomcat、Jetty、JBoss、GlassFish默认的servlet名字是default,WebLogic默认的servlet名字是FileServlet,WebSphere默认的servlet名字是SimpleFileServlet。

Tomcat, Jetty, JBoss, and
GlassFish  默认 Servlet的名字 -- "default"
Google App Engine 默认 Servlet的名字 -- "_ah_default"
Resin 默认 Servlet的名字 -- "resin-file"
WebLogic 默认 Servlet的名字  -- "FileServlet"
WebSphere  默认 Servlet的名字 -- "SimpleFileServlet" 

转载来源:http://yedward.net/?id=350

2、在applicationContext.xml中进行配置。本篇文章不完善,补充文章地址为:

静态资源过滤方式补充

配置方式如下:

<!-- 过滤静态资源 -->
	<mvc:resources mapping="/js/**" location="/js/" />
	<mvc:resources mapping="/pages/assets/**" location="/pages/assets/" />
	<mvc:resources mapping="/pages/js/**" location="/pages/js/" />
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>下面的配置也是必须配置,配置描述在,补充描述文章:http://blog.csdn.net/u012246342/article/details/52366514
<span style="white-space:pre">	</span><!-- 启用spring mvc 注解 -->
<span style="white-space:pre">	</span><mvc:annotation-driven/>  
<span style="white-space:pre">	</span><!-- 配置默认servlet handler -->
<span style="white-space:pre">	</span><mvc:default-servlet-handler/> 

但是,配置 这个 标签 mvc:resources,需要在beans中:

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-3.0.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
            http://www.springframework.org/schema/jdbc
            http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
			http://www.springframework.org/schema/mvc
			http://www.springframework.org/schema/mvc/spring-mvc.xsd  ">

beans配置中,需要新增:

xmlns:mvc="http://www.springframework.org/schema/mvc"  

在xsi:schemaLocation中,增加

http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd 

关于beans配置,可以了解我写的另一篇文章:

http://blog.csdn.net/u012246342/article/details/52230456

增加对mvc标签的支持。

这个配置是对文件进行过滤,其实也是请求,拦截的是请求的路径。

从webapp/下

/pages/js/**    /js/**  /css/**等等。

3、自定义拦截器,对所有请求进行拦截,并根据配置实施过滤。

首先,在web.xml中,配置如下。

	<filter>
		<filter-name>securityFilter</filter-name>
		<filter-class>com.wswhr.filter.SecurityFilter</filter-class>
		<init-param>
			<param-name>ignores</param-name>
			<param-value>/perm/getCanalChargeUsers,/changePW,/app/appNavs,/app/download,/tulogin,/tulogout,/static,/login,/img/select,/tokenMethod,/deleteToken</param-value>
		</init-param>
	</filter>

关于init-param,看我转载的另一篇文章:里面对filter有更详细的描述,文章是完全转载。

http://blog.csdn.net/u012246342/article/details/52228642

增加过滤后,需要自己实现Filter。

代码如下:

package com.wswhr.filter;

import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.context.WebApplicationContext;

import com.tujia.common.exception.UnAuthedException;
import com.tujia.core.security.SecurityUtil;

public class SecurityFilter implements Filter {

	private Set<String> prefixIignores = new HashSet<String>();

	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) res;

		if (canIgnore(request)) {
			chain.doFilter(req, res);
			return;
		}

		try {
			//
			boolean validUser = loginOrNo(request, response);// 进行登录认证...
			if (!validUser) {//判断是否登录。否,跳转登录页面,
				String cp = request.getContextPath();
				response.sendRedirect(cp+"/tulogin");
				return;
			}
			chain.doFilter(req, res);//已经登录
		} catch (UnAuthedException e) {
			e.printStackTrace();
		} finally {
			SecurityUtil.clearOnThreadOver();
		}
	}

	public void init(FilterConfig config) throws ServletException {

		ServletContext servletContext = config.getServletContext();
		WebApplicationContext ap = (WebApplicationContext) servletContext
				.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

		String cp = config.getServletContext().getContextPath();
		String ignoresParam = config.getInitParameter("ignores");
		String[] ignoreArray = ignoresParam.split(",");
		for (String s : ignoreArray) {
			prefixIignores.add(cp + s);
		}
	}

	@Override
	public void destroy() {
		prefixIignores = null;
	}

	private boolean canIgnore(HttpServletRequest request) {
		String url = request.getRequestURI();
		for (String ignore : prefixIignores) {
			if (url.startsWith(ignore)) {
				return true;
			}
		}
		return false;
	}

}

代码很简单,我稍微说一下。

在init初始化方法中,获取所有的ignores 配置的参数。放到 Set集合中,在请求被拦截之后,取出请求的URL,与set中的所有请求进行匹配。

如果有相同,则不拦截。

如果不同,则验证用户是否登录,

如果没有登录,跳转登录页面,

如果已经登录,不拦截。

以上是三种静态资源过滤方式。如果有其他更好的方式,请共享到任意论坛博客,方便更好的交流,也可以联系我,我更改本篇文章,引用你的方式,当然,肯定会标注好引用来源。

写博客,是为了更好的技术交流。

QQ:1286238812.

时间: 2024-11-03 14:46:49

更改静态资源过滤方式。的相关文章

静态资源过滤方式补充

昨天写过一篇 更改静态资源过滤方式. 在写 mvc:resources 配置,少写了一些.因此,在项目访问时,报错404. <!-- 过滤静态资源 --> <mvc:resources mapping="/js/**" location="/js/" /> <mvc:resources mapping="/pages/assets/**" location="/pages/assets/" /&g

spring mvc-filter如何对静态资源.css/.js/.jpg不进行过滤

问题描述 filter如何对静态资源.css/.js/.jpg不进行过滤 1C web.xml中filter配置 <filter> <filter-name>loginFilter</filter-name> <filter-class>com.cbt.Interceptor.LoginFilter</filter-class> <init-param> <param-name>loginPage</param-na

自定义Filter过滤静态资源

在springMVC中,可以通过配置来过滤静态资源, 也可以在web.xml中进行配置,通过自定义Filter来实现. web.xml配置如下. <filter> <filter-name>securityFilter</filter-name> <filter-class>com.wswhr.SecurityFilter</filter-class> <init-param> <param-name>ignores<

SpringMVC访问静态资源的三种方式

 如果你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截"/",拦截了所有的请求,同时对*.js,*.jpg的访问也就被拦截了. 问题原因:罪魁祸首是web.xml下对spring的DispatcherServlet请求url映射的配置,原配置如下: [html] view plain copy   <servlet>       <servlet-name>sprin

Spring MVC中如何防止静态资源被Interceptor过滤

问题描述 我的配置是web.xml<servlet> <servlet-name>appServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name>

js文件-springmvc 静态资源 404问题

问题描述 springmvc 静态资源 404问题 项目根目录结构: Web.xml中配置 Spring-sevlet.Xml中配置 首页JSP中调用外部文件 该链接按中Ctrl后再点击,可访问. 之后依旧无法调用JS文件,跪求大神!!!!!!! 解决方案 我也遇到过这个问题.这里有三种方法可以解决:Spring3中js/css/jpg/gif等静态资源无法找到.我习惯第二种 解决方案二: 你的配置文件放到哪里了,有没有正确应用? 解决方案三: 看你的配置,应该是JSP里面引用js文件的路径问题

【spring boot】7.静态资源和拦截器处理 以及继承WebMvcConfigurerAdapter类进行更多自定义配置

   开头是鸡蛋,后面全靠编!!! ========================================================  1.默认静态资源映射路径以及优先顺序   Spring Boot 默认为我们提供了静态资源处理,使用 WebMvcAutoConfiguration 中的配置各种属性. 建议大家使用Spring Boot的默认配置方式,提供的静态资源映射如下: classpath:/META-INF/resources classpath:/resources

静态资源压缩(GZIP)

1.开GZIP有什么好处?答:Gzip开启以后会将输出到用户浏览器的数据进行压缩的处理,这样就会减小通过网络传输的数据量,提高浏览的速度.Tips:如果网站的用户分布比较分散,并且静态文件过大,可以将静态文件放到CDN Spring Boot中进行如下配置即可: server.compression.enabled=true 73.20 Enable HTTP response compressionHTTP response compression is supported by Jetty,

静态资源缓存控制grunt插件

前端性能优化中一个很重要的方面就是充分利用缓存,比如通过cache-control, expires, eTag等来控制静态资源失效时间,很多大型网站的静态资源实现实现甚至到了几年.这确实提高了页面加载速度,但同时引来另一个问题,我更改了静态资源,如何让客户端更新缓存. 思路 最有效的解决方案是修改其所有链接,这样,全新的请求将从原始服务器下载最新的内容. 没错,但是怎样更新链接? 来看看一般前端团队的做法 index.html页面里: <script charset="utf-8&quo