关闭

更改静态资源过滤方式。

标签: 静态资源拦截
2106人阅读 评论(0) 收藏 举报
分类:

项目中,考虑了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.

0
0
查看评论

Springmvc静态资源过滤

一般情况下,在springmvc中当配置了拦截器和过滤器之后,对于浏览器的所有符合要求的请求都会过滤,静态资源也不例外,为了解决这个问题,下面提供了几个方案:
  • xiaoshen_joyin
  • xiaoshen_joyin
  • 2016-06-28 15:42
  • 1314

关于使用security和静态资源被拦截的问题

之前的博客中我给过如何在springboot中整合security,当时写的界面很简单,没有CSS样式,更谈不上静态资源,而现在在实际开发过程中经理让我们用security来开发,界面肯定不可能就是两个输入框,一个按钮就完事啊,当加上CSS样式的时候问题就来了,首先是CSS样式没办法被加载,其次登录...
  • malachi95
  • malachi95
  • 2016-12-14 16:32
  • 3873

自定义filter中配置不被过滤的资源

我在项目中配置的过滤器设置的路径是/*,这意味着每一个资源都会被拦截,这时候如果我们想把一些资源拿出来不让其被拦截时(比如说某些css样式,js等静态文件),我们就需要在重写的过滤器的init方法中做些文章了:首先,在init方法中,我们可以通过代码得到web.xml中filter的init-par...
  • vince_Da
  • vince_Da
  • 2017-04-24 21:55
  • 1743

自定义Filter过滤静态资源

在springMVC中,可以通过配置来过滤静态资源, 也可以在web.xml中进行配置,通过自定义Filter来实现。 web.xml配置如下。 securityFilter com.wswhr.SecurityFilter ignores /perm/getCa...
  • u012246342
  • u012246342
  • 2016-08-17 11:01
  • 4764

java-web-Filter-登录验证之筛选器使用实例

java-web-Filter-登录验证之筛选器使用实例 一、简介: Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从...
  • xxj_jing
  • xxj_jing
  • 2017-05-02 11:46
  • 698

静态资源访问与拦截

静态资源访问映射: 先调整web.xml中的DispatcherServlet的配置,使其可以捕获所有的请求: 1 2 3 4 5 6 7 8 9         spring...
  • cws1214
  • cws1214
  • 2016-09-11 10:07
  • 3552

Spring MVC中css等静态资源被拦截解决办法

这段时间在学spring mvc ,着实吃了不少苦,今天将遇到的配置文件问题记录一下 Spring MVC中css等静态资源被拦截,3.0.5以上版本可在xxxx-servlet.xml中添加如下标签   mapping是项目中会用到的引用路径,location是静态...
  • shuaicenglou3032
  • shuaicenglou3032
  • 2017-03-07 19:34
  • 365

springmvc 拦截器拦截静态资源

springmvc拦截器interceptors   springmvc拦截器能够对请求的资源路径进行拦截,极大的简化了拦截器的书写。但是,千万千万要注意一点:静态资源的放行。  上代码: ... ... <!-- 使用bean定义一个Inter...
  • chenwiehuang
  • chenwiehuang
  • 2016-09-13 15:53
  • 6924

java 使用全局过滤器Filter之后 防止css文件与js文件被过滤

昨天还好好的一个页面,添加Filter后所有的样式都没有了 web.xml中添加了过滤器如下:       SSOFilter     com.adcc.aerops.utils.SSOFilter     ...
  • u011424470
  • u011424470
  • 2016-08-02 17:00
  • 3876

解决Spring Boot OTS parsing error: Failed to convert WOFF 2.0

在项目中为了方便配置,通常会使用properties文件保存配置信息,项目启动时,需要maven开启filtering用properties中的属性值替换掉配置文件中的占位符,比如我的项目中使用c3p0.properties文件保存数据库的连接信息,这样我每次需要修改数据库的连接信息时,只需要修改c...
  • u013737646
  • u013737646
  • 2016-03-23 00:11
  • 4935
    个人资料
    • 访问:437474次
    • 积分:5526
    • 等级:
    • 排名:第5743名
    • 原创:157篇
    • 转载:103篇
    • 译文:1篇
    • 评论:45条
    最新评论