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


猜你喜欢
- 对象内存分配与回收策略对象的内存分配,往大方向讲,就是在堆上分配〔但也可能经过JIT编译后被拆散为标量类型并间接地栈上分配),对象主要分配在
- 1:定义一个自己的父级容器,让它继承自一个布局(LinearLayout、RelativeLayout都可以)public class Si
- 前言最近需求中,需要实现 卫星菜单的需求,最终通过自定义View和动画属性来实现,具体功能如下:1.自定义Viewimport androi
- 对于一个应用程序而言,控件是搭建用户界面的积木。它们具备交互式的特征。VS 2012中的控件都放在工具箱中,添加一个控件到窗体,只需在工具箱
- 本文实例讲述了Android Dialog对话框用法。分享给大家供大家参考,具体如下:Activities提供了一种方便管理的创建、保存、回
- 1. 概述JDK * 是利用java反射机制 生成一个实现接口的匿名类, 在调用具体方法前调用InvocationHandler来处理Cg
- Redisson分布式锁之前的基于注解的锁有一种锁是基本redis的分布式锁,锁的实现我是基于redisson组件提供的RLock,这篇来看
- 之前学习oracle,简单的认为数据库只存在服务器端,学习安卓之后才发现原来android和Ios本身是“携带”数据库的——SQ
- 最近正式入坑Flutter,首先从环境搭建开始,看了网上好多关于Windows环境搭建的资料,基本都是按官方文档写的,看完的感受是,还不如直
- Recyclerview现在基本已经替代Listview了,RecyclerView也越来越好用了 当我们有实现条目的拖拽排序和
- 1、问题引入我们已经完成了后台系统的登录功能开发,但是目前还存在一个问题,就是用户如果不登录,直接访问系统首页面,照样可以正常访问。很明显,
- 各位亲们可以尝试以下代码:注:这里我就只有一个html标签对来说明问题了,首部之类的东西,自己添加。<html> &n
- Android Studio连接手机设备教程,供大家参考,具体内容如下一、ADB环境配置1.查看自己Android Studio配置的sdk
- 在 Lock 接口中,获取锁的方法有 4 个:lock()、tryLock()、tryLock(long,TimeUnit)、lockInt
- 在上周发布的 TienChin 项目视频中,我和大家一共梳理了六种幂等性解决方案,接口幂等性处理算是一个非常常见的需求了,我们在很多项目中其
- 本文实例讲述了Java编程实现向文本文件中读取数据之Scanner用法。分享给大家供大家参考,具体如下:使用Scanner类来读取文件我们使
- @Value获取application.properties配置无效问题无效的原因主要是要注意@Value使用的注意事项:1、不能作用于静态
- 本文实例为大家分享了Android实现布局全屏的具体代码,供大家参考,具体内容如下前言类似Launcher,希望占用的布局铺满全屏,以调整状
- 今天写一个小程序有一个给图片加上阴影的需求,记得WPF的Effect中就有阴影特效,就打算用它了。代码如下:using (var image
- 一:模式说明模式定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求