JavaEE开发之SpringMVC中的自定义拦截器及异常处理

一、自定义拦截器

顾名思义,拦截器是负责拦截某些东西的工具。本部分我们创建的拦截器是负责拦截请求的。这个拦截器类似于高速收费站,只要是想上高速的,都得经过我这个拦截器才可以。也就是说,接下来我们所创建的拦截器就类似于收费站的作用、所有的用户请求都会经过我们这个拦截器。废话少说,接下来我们就来创建一个拦截器,并部署到我们的Spring中。

1、自定义拦截器的创建

接下来我们就要创建自定义拦截器了,首先我们创建一个Java类,命名为CustomInterceptor。因为我们要创建的是Spring中的拦截器,所以要继承与springframework中的HandlerInterceptorAdapter抽象类。创建CustomInterceptor类的过程如下

  

HandlerInterceptorAdapter是Spring框架中自定义拦截器的适配器,我们可以看一下HandlerInterceptorAdapter抽象类的具体实现,下方是我们关联的Spring框架的源代码中的HandlerInterceptorAdapter抽象类的实现。

从下方源代码中我们不难看出HandlerInterceptorAdapter抽象类实现了AsyncHandlerInterceptor接口,在HandlerInterceptorAdapter的每个方法中并没有具体实现什么东西,所以我们继承HandlerInterceptorAdapter后,要对相应的方法进行实现。这些方法会在拦截用户请求的特定阶段去执行,下方会具体介绍到。

  

2、自定义拦截器中相应方法的重写

下方代码段就是我们CustomInterceptor类中所重写的方法。preHandle()方法会在请求处理之前执行,postHandle()方法会在请求处理后执行,afterCompletion()方法会在请求完成并拦截完成后执行。下方是对相应的方法进行了重写。

复制代码

 1 public class CustomInterceptor extends HandlerInterceptorAdapter {
 2     //请求处理之前执行的方法
 3     @Override
 4     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
 5             throws Exception {
 6         System.out.println("在请求处理之前执行该方法-preHandle");
 7         request.setAttribute("startTime", System.currentTimeMillis());
 8         return true;
 9     }
10     
11     //在请求处理之后执行该方法
12     @Override
13     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
14             ModelAndView modelAndView) throws Exception {
15         System.out.println("在请求处理之后执行该方法-postHandle");
16         long startTime = (Long) request.getAttribute("startTime");
17         long handleTime = System.currentTimeMillis() -startTime;
18         System.out.println("本次请求花费了:" + handleTime + "ms\n");
19     }
20     
21     //请求处理完成所执行的方法
22     @Override
23     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
24             throws Exception {
25         System.out.println("请求处理完成所执行的方法-afterCompletion");
26     }
27     
28 }

复制代码

3.配置自定义拦截器

创建完相应的拦截器后,我们还需将其配置到Spring中该拦截器才起作用。因为我们的Spring配置类继承了WebMvcConfigurerAdapter抽象类,而在WebMvcConfigurerAdapter抽象类中就有添加拦截器的方法addInterceptors()。我们可以重写此方法,通过该方法我们可以添加多个拦截器。

下方截图中的代码段就是在Spring的配置文件中来配置Interceptor的代码段。首先我们创建了一个自定义拦截器Bean,然后将拦截器的Bean通过addInterceptors()方法添加到Spring中即可。如下所示:

  

4、拦截器的测试

创建以及配置好拦截器后,我们就开始测试了。Tomcat重启后,我们发起网络请求。下方是控制台打出的log信息。从输出结果我们不难看出,只要有网络请求,就会执行拦截器中相应的方法。如下所示:

  

二、将Controller返回的信息展示到JSP模板(ModelAndView)

本部分是为下一部分做铺垫的,本部分所做的事情就是将Controller中路由所映射的方法所返回的内容输出到JSTL模板上。当然主要还是用到了spring框架中的ModelAndView对象。该对象会将返回的信息与JSTL模板上的参数进行绑定,然后在JPS页面上进行显示,当然这与PHP中的Smarty模板引擎的工作方式是极为相似的。下方就使用ModelAndView对象将信息输出到JSTL模板上。

1.创建JSTL模板文件

首先我们创建接纳Controller返回信息的页面模板,在此我们在src/main/resources目录的views下面创建一个message.jsp文件。文本内容比较简单,只有一个JSTL标签${message_key}, 该标签可以接受Controller中相应的方法所返回的信息。

复制代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
</head>
<body>
    <h1>${message_key}</h1>
</body>
</html>

复制代码

2、给JSTL标签赋值

接下来所做的就是在相应的Controller相应的方法中给message_key标签绑定相应的值,并在相应的模板文件中进行显示。接下来我们就来创建一个ModelViewController控制器类,来负责值的绑定。下方代码段就是我们的ModeViewController的实现内容。

主要还是ModelAndView的使用。首先我们创建了一个ModelAndView的对象,在ModelAndView的构造器中传入的参数就是JSTL模板所在的JSP页面的文件名。然后ModelAndView对象通过调用addObject()方法对“message_key”进行了“Hello world”的值的绑定,最后将modelAndView对象进行返回。如下所示:

  

3、对页面的访问

实现完Controller以及相应的JSP文件后,接下来我们就该对其进行访问了。下方是对相应路由的访问结果,从输出结果中我们可以看出,${message_key}的值就是相应Controller中所返回的值。

  

三、异常的统一处理

接下来我们就来捕获抛出的异常,并将异常信息通过ModelAndView的对象交付给指定错误处理页面来显示。要实现该功能,主要用到的注解是@ControllerAdvice和@ExceptionHandel注解。首先我们将创建的Java类ExceptionHandlerAdvice使用注解@ControllerAdvice进行修饰,然后将exception()方法使用@ExceptionHandler进行注解,使其成为处理异常的方法。

在exception()方法中使用ModelAndView对象将错误信息交付给error.jsp进行显示即可。

  

定义完处理异常的Advice后,接下来就该抛出个异常来测试一下我们异常处理的方法了。下方的这个AdviceController就是我们测试类,其中抛出了一个异常。具体代码如下所示:

  

下方是我们访问“/advice”路由所返回的结果,可以看出,抛出的异常以及在exception()方法中进行处理了。

  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JavaEE拦截器是一种常见的应用程序组件,它可以在请求到达目标资源之前或之后执行某些操作。以下是JavaEE使用拦截器的一些方法和步骤: 1. 创建一个类并实现javax.servlet.Filter接口,该接口定义了doFilter()方法,该方法在请求到达目标资源之前或之后执行某些操作。 ```java public class MyFilter implements javax.servlet.Filter { public void init(FilterConfig config) throws ServletException { // 初始化操作 } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 在请求到达目标资源之前执行的操作 chain.doFilter(request, response); // 调用下一个过滤器或目标资源 // 在请求到达目标资源之后执行的操作 } public void destroy() { // 销毁操作 } } ``` 2. 在web.xml文件配置过滤器,指定拦截的URL模式和拦截器类。 ```xml <filter> <filter-name>MyFilter</filter-name> <filter-class>com.example.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/user/*</url-pattern> </filter-mapping> ``` 上述配置表示拦截以/user/开头的所有URL请求,并使用MyFilter类进行处理。 3. 在Servlet使用注解配置拦截器。 ```java @WebServlet("/user") @ServletSecurity(@HttpConstraint(rolesAllowed = {"admin"})) public class MyServlet extends HttpServlet { // Servlet代码 } ``` 上述代码使用@WebServlet注解指定了Servlet的URL模式,使用@ServletSecurity注解指定了需要的安全角色。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值