软件编程
位置:首页>> 软件编程>> java编程>> Java Spring * 案例详解

Java Spring * 案例详解

作者:溜了溜了AA  发布时间:2022-11-01 07:15:06 

标签:Spring, ,

springmvc提供了 * ,类似于过滤器,他将在我们的请求具体出来之前先做检查,有权决定接下来是否继续,对我们的请求进行加工。
* ,可以设计多个。

通过实现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的配置


<!-- * 的配置-->
<mvc:interceptors>
   <mvc:interceptor>
       <!--

-->
       <mvc:mapping path="/**/*"/>
       <bean class="com.xy.interceptors.MethodTimerInterceptor">

</bean>
   </mvc:interceptor>
</mvc:interceptors>

案例二:会话 *


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().setAttribute("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>

<!--只想拦截/user2/**/*
       还需要开放登录权限
   -->
   <mvc:interceptor>
       <mvc:mapping path="/user2/**/*"/>
       <!--排除登录的URI-->
       <mvc:exclude-mapping path="/user2/login"></mvc:exclude-mapping>
       <bean class="com.xy.interceptors.SessionInterceptor"></bean>
   </mvc:interceptor>
</mvc:interceptors>

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

* 执行顺序问题

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

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

* 与过滤器的比较

相似

1,都有优先处理请求的权利,都可以决定是否将请求转移到请求的实际处理的控制器处。
2,都可以对请求或者会话当中的数据进行加工。
不同

1, * 可以做前置处理也可以做后置处理,还可以进行完成处理,控制的 更加细致,而过滤器只负责前面的过滤行为而已。
2, 过滤器优先执行,还是 * 优先呢?----------过滤器优先。
3,过滤器是servlet规范里面的组件。
4, * 都是框架自己而外添加的组件。

来源:https://blog.csdn.net/shaorouAA/article/details/102574483

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com