项目中,考虑了3种过滤资源方式。
1、在web.xml中过滤。
配置如下:
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
/WEB-INF/classes/mvc-config.xml
2
springmvc
/
springmvc
*.json
springmvc
*.xml
default
*.html
default
*.swf
default
*.css
default
*.xls
default
*.rar
default
*.zip
default
*.gif
default
*.jpg
default
*.png
default
*.js
default
*.woff
default
*.ttf
default
*.eot
default
*.otf
default
*.svg
配置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中进行配置。本篇文章不完善,补充文章地址为:
静态资源过滤方式补充
配置方式如下:
下面的配置也是必须配置,配置描述在,补充描述文章:http://blog.csdn.net/u012246342/article/details/52366514
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
http://blog.csdn.net/u012246342/article/details/52230456
增加对mvc标签的支持。
这个配置是对文件进行过滤,其实也是请求,拦截的是请求的路径。
从webapp/下
/pages/js/** /js/** /css/**等等。
3、自定义拦截器,对所有请求进行拦截,并根据配置实施过滤。
首先,在web.xml中,配置如下。
securityFilter
com.wswhr.filter.SecurityFilter
ignores
/perm/getCanalChargeUsers,/changePW,/app/appNavs,/app/download,/tulogin,/tulogout,/static,/login,/img/select,/tokenMethod,/deleteToken
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 prefixIignores = new HashSet();
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.