过滤器:servlet
拦截器:springmvc
①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,
在拦截器里注入一个service,可以调用业务逻辑。
拦截器是一种类似过滤器的拦截机制,过滤器是拦截servlet等静态资源(图片,视频,jscss....)
拦截器是Springmvc内置实现,拦截action,它必须实现接口HandleInterceptor
一般是preHandle方法的重写:
return true 通过
return false 打回
表单防止重复提交:
表单中使用自定义标签:
<%@ tag language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ attribute name="token" required="false"%><!--这一行可以不写-->
<%
String random=UUID.randomUUID().toString();
String key=(token==null?"myToken":token);
session.setAttribute(key, random);
%>
<input type="hidden" name="<%=key%>" value="<%=random%>" />
标签的引用:
<%@taglib tagdir="/WEB-INF/tags" prefix="f"%>
<form action="${pageContext.request.contextPath}/fee" method="post">
收益: <input type="text" name="fee">
<f:xx></f:xx>
<input type="submit" value="提交">
</form>
实现接口HandleInterceptor,重写preHandle():
public class TokenInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
//表单提交时获取隐藏域中的标识,获取到后与sesion中的标识比较,
//相同则提交通过,然后删除掉session中的值
String token = request.getParameter("myToken");
Object myToken = request.getSession().getAttribute("myToken");
if (token != null) {
if (myToken == null) {
return false;
} else {
if (token.equals(myToken)) {
request.getSession().removeAttribute("myToken");
return true;
}
}
} else {
return true;
}
return false;
}
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}
xx.servlet.xml配置:
<mvc:interceptors>
<!-- 配置拦截器:防止重复提交 -->
<mvc:interceptor>
<mvc:mapping path="/fee"/> <!-- /**拦截所有的action -->
<bean class="cn.et.lesson5.TokenInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
拦截器:springmvc
http://blog.csdn.net/chenleixing/article/details/44573495
过滤器和拦截器的区别:①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,
在拦截器里注入一个service,可以调用业务逻辑。
拦截器是一种类似过滤器的拦截机制,过滤器是拦截servlet等静态资源(图片,视频,jscss....)
拦截器是Springmvc内置实现,拦截action,它必须实现接口HandleInterceptor
一般是preHandle方法的重写:
return true 通过
return false 打回
表单防止重复提交:
表单中使用自定义标签:
WEB-INF中建立一个tags目录:自定义标签(xx.tag)
<%@ tag language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ attribute name="token" required="false"%><!--这一行可以不写-->
<%
String random=UUID.randomUUID().toString();
String key=(token==null?"myToken":token);
session.setAttribute(key, random);
%>
<input type="hidden" name="<%=key%>" value="<%=random%>" />
标签的引用:
<%@taglib tagdir="/WEB-INF/tags" prefix="f"%>
<form action="${pageContext.request.contextPath}/fee" method="post">
收益: <input type="text" name="fee">
<f:xx></f:xx>
<input type="submit" value="提交">
</form>
实现接口HandleInterceptor,重写preHandle():
public class TokenInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
//表单提交时获取隐藏域中的标识,获取到后与sesion中的标识比较,
//相同则提交通过,然后删除掉session中的值
String token = request.getParameter("myToken");
Object myToken = request.getSession().getAttribute("myToken");
if (token != null) {
if (myToken == null) {
return false;
} else {
if (token.equals(myToken)) {
request.getSession().removeAttribute("myToken");
return true;
}
}
} else {
return true;
}
return false;
}
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}
xx.servlet.xml配置:
<mvc:interceptors>
<!-- 配置拦截器:防止重复提交 -->
<mvc:interceptor>
<mvc:mapping path="/fee"/> <!-- /**拦截所有的action -->
<bean class="cn.et.lesson5.TokenInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>