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