SpringMVC拦截器
一、拦截器和过滤器的区别: ①拦截器是基于Java的反射机制的,而过滤器是基于函数回调。 ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。 ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。 ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。 ⑤在action的生命周期中,拦截器可以多次被调用
·
一、拦截器和过滤器的区别:
①拦截器是基于Java的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
二、项目应用以及配置
spring配置文件:
文件头添加以下mvc头:
xmlns:mvc="http://www.springframework.org/schema/mvc"
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
具体如下:
再添加拦截器【根据特定的请求路径拦截】:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/lgGoods/*" />
<mvc:mapping path="/lgNeeds/*" />
<bean class="com.company.center.web.interceptor.LgCompanyInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
bean对应的拦截器两种实现:
1. 实现HandlerInterceptor接口
import com.alibaba.dubbo.common.utils.StringUtils;
import com.A.B.dao.CommonDao;
import org.apache.shiro.SecurityUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
/**
*
* 实现HandlerInterceptor接口
*/
public class LgCompanyInterceptor implements HandlerInterceptor {
@Resource
private CommonDao commonDao;
/**
* 访问controller之前调用
*
* @param request
* @param response
* @param o
* @return ture:往下执行 false:请求终止
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
// 请求路径 [/lgGoods/init ]
String servletPath = request.getServletPath();
// 数据库中的公司信息
LgCompanyPO lgCompanyPO = (LgCompanyPO)commonDao.getByExample(param);
// 账户为暂停交易的场合,该公司用户不能进行数据操作
if (StringUtils.isEquals(lgCompanyPO.getStatus(), CompanyStatusEnum.COMPANY_STATUS_PAUSE.getCode())) {
// response.sendRedirect("/common/toNoAccess");
response.setCharacterEncoding("UTF-8");//设置编码
response.setContentType("text/html");//服务器响应类型
PrintWriter out = response.getWriter();//获得输出流
out.print("<script>" + "layer.alert('账户为暂停交易状态,无权限进行该操作!');" + "</script>");
out.close();
return false;
}
return true;
}
/**
* 执行完controller具体方法后,渲染页面前调用
*
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
/**
* 渲染完页面后调用
*
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @param e
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
</pre><pre code_snippet_id="1810903" snippet_file_name="blog_20160805_3_3649166" name="code" class="java">
2. 继承适配器类(HandlerInterceptorAdapter), 例如业务只用到preHandle方法的时候,建议用这种。重写preHandle方法即可!
</pre><pre code_snippet_id="1810903" snippet_file_name="blog_20160805_3_3649166" name="code" class="java">import com.alibaba.dubbo.common.utils.StringUtils;
import com.A.B.dao.CommonDao;
import org.apache.shiro.SecurityUtils;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
/**
* 继承HandlerInterceptorAdapter 适配器
*
*/
public class LgCompanyInterceptor extends HandlerInterceptorAdapter {
@Resource
private CommonDao commonDao;
/**
* 访问controller之前调用
*
* @param request
* @param response
* @param o
* @return ture:往下执行 false:请求终止
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
// 请求路径
String servletPath = request.getServletPath();
if (StringUtils.isEquals(lgCompanyPO.getStatus(), CompanyStatusEnum.COMPANY_STATUS_PAUSE.getCode())) {
// response.sendRedirect("/common/toNoAccess");
response.setCharacterEncoding("UTF-8");//设置编码
response.setContentType("text/html");//服务器响应类型
PrintWriter out = response.getWriter();//获得输出流
out.print("<script>" + "layer.alert('账户为暂停交易状态,无权限进行该操作!');" + "</script>");
out.close();
return false;
}
return true;
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)