Java Spring拦截器案例详解

网友投稿 279 2022-12-19

Java Spring拦截器案例详解

springmvc提供了拦截器,类似于过滤器,他将在我们的请求具体出来之前先做检查,有权决定接下来是否继续,对我们的请求进行加http://工。

拦截器,可以设计多个。

通过实现handlerunterceptor,这是个接口

定义了非常重要的三个方法:

后置处理

前置处理

完成处理

案例一:

通过拦截器实现方法耗时统计与警告

package com.xy.interceptors;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

/**

* 方法耗时统计拦截器

*/

public class MethodTimerInterceptor implements HandlerInterceptor {

private static final Logger LOGGER=Logger.getLogger(MethodTimerInterceptor.class);

//前置功能, 开始到结束,两个点减法

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

//定义开始时间

long start = System.currentTimeMillis();

//2.将其存到请求域当中

request.setAttribute("start",start);

//记录请求日志

LOGGER.info(request.getRequestURI()+",请求到达");

//3,返回true,才会找下一个拦截器,如果没有下一个拦截器,则去Controller

return true;

}

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

//1,取出start

long start = (long) request.getAttribute("start");

//2,得到end

long end =System.currentTimeMillis();

//3,记录耗时

long spendTime = end-start;

if (spendTime>2000){

LOGGER.warn("方法耗时严重,请及时处理,耗时:"+spendTime);

}else {

LOGGER.info("方法耗时"+spendTime+"毫秒,正常");

}

}

@Override

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

}

}

springmvc的配置

案例二:会话拦截器

package com.xy.interceptors;

import com.xy.pojo.User;

import org.apache.log4j.Logger;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class SessionInterceptor implements HandlerInterceptor {

private static final Logger LOGGER=Logger.getLogger(SessionInterceptor.class);

//检查当前会话是否有User,如果有则放行,没有则拦截

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

Object user = request.getSession().getAttribute("SESSION_USER");

if (user==null){

LOGGER.warn("您不具备权限,请先登录");

return false;

}

if(user instanceof User){

//再去数据库检查其身份对不对,是否冻结。。。

User user1 = (User) user;

user1.setPwd(null);

request.getSession().setAttribhttp://ute("SESSION_USER",user1);

LOGGER.info(user1.getName()+"处于登录状态,可以执行操作");

return true;

}else {

LOGGER.warn("请先登录");

return false;

}

}

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

}

@Override

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

}

}

springMvc配置

将其配置在mvc:interceptors节点之下即可。

拦截器执行顺序问题

如果有N个拦截器,并且都能拦截到某个URI的时候,执行顺序问题,

在springmvc当中拦截器定义的顺序是有关系的。配置在前面的优先拦截,按照顺序来

拦截器与过滤器的比较

相似

1,都有优先处理请求的权利,都可以决定是否将请求转移到请求的实际处理的控制器处。

2,都可以对请求或者会话当中的数据进行加工。

不同

1, 拦截器可以做前置处理也可以做后置处理,还可以进行完成处理,控制的 更加细致,而过滤器只负责前面的过滤行为而已。

2, 过滤器优先执行,还是拦截器优先呢?----------过滤器优先。

3,过滤器是servlet规范里面的组件。

4, 拦截器都是框架自己而外添加的组件。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:C++字符串的处理详解
下一篇:java中for和forEach的速度比较实例Demo
相关文章

 发表评论

暂时没有评论,来抢沙发吧~