关闭

更改静态资源过滤方式。

标签: 静态资源拦截
1201人阅读 评论(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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:281869次
    • 积分:4344
    • 等级:
    • 排名:第7226名
    • 原创:157篇
    • 转载:101篇
    • 译文:1篇
    • 评论:35条
    最新评论