Java SpringMVC实现自定义拦截器
简介
在Java SpringMVC中,可以通过自定义拦截器来实现许多功能,例如登录验证、权限控制、日志记录等。通过拦截器,我们可以在请求到达Controller之前或之后对请求进行一些处理。在本文中,我们将讲解如何使用Java SpringMVC来实现自定义拦截器。
1. 创建拦截器
实现HandlerInterceptor接口
要创建一个自定义的拦截器,我们需要先实现SpringMVC提供的HandlerInterceptor接口。该接口包含了三个方法,分别是preHandle()、postHandle()和afterCompletion()。
preHandle()
该方法在请求到达Controller之前被调用。我们可以在该方法中检查一些条件,例如用户是否已经登录等。如果该方法返回true,则请求会继续向Controller进行处理;如果返回false,则请求不会继续进行,直接返回给客户端。
postHandle()
该方法在Controller的处理完成后,但在视图返回之前被调用。我们可以在该方法中修改返回的ModelAndView。该方法具有一个参数ModelAndView,可以在该参数中添加一些额外的数据以供视图使用。
afterCompletion()
该方法在视图返回后调用。该方法可以用于清理一些资源,例如关闭数据库连接等。
下面是一个简单的拦截器示例:
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("Pre handle method is calling");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("Post handle method is calling");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) throws Exception {
System.out.println("After completion handle method is calling");
}
}
2. 配置拦截器
配置拦截器
要使用自定义拦截器,我们需要在SpringMVC的配置文件中进行配置。在配置文件中,我们需要通过mvc:interceptors标签来配置拦截器。下面是一个简单的配置示例:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="/login"/>
<bean class="com.example.MyInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
在上面的例子中,我们创建了一个拦截器MyInterceptor,并将其应用于所有请求中,但是排除了/login请求。
3. 测试拦截器
我们已经创建了一个简单的拦截器并进行了配置,现在我们需要测试它是否正常工作。我们可以创建一个Controller,并在该Controller的方法中添加一些打印语句,以便我们可以在控制台中查看拦截器的请求流程。
@Controller
public class MyController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String sayHello(Model model) {
System.out.println("Hello method is calling");
model.addAttribute("message", "Hello, World!");
return "hello";
}
}
上面的Controller包括一个简单的sayHello()方法,该方法返回一个视图名称hello,并将一些数据添加到Model中。当我们在浏览器中访问/hello请求时,控制台中输出的信息应如下所示:
Pre handle method is calling
Hello method is calling
Post handle method is calling
After completion handle method is calling
4. 示例说明
以上是一个简单的实现拦截器的示例,下面我会再举一个实际案例来说明如何应用拦截器。
案例背景:在一个电商平台中,用户下单时需要登录,为了方便用户和提高用户体验,我们可以使用拦截器进行登录验证。
代码实现:
创建一个拦截器LoginInterceptor
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
if (user == null) {
response.sendRedirect("login");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// do nothing
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// do nothing
}
}
在上面的拦截器中,我们通过检查Session中是否有一个名为user的属性来判断用户是否已经登录。如果用户没有登录,我们将请求重定向到登录页面,并返回false,表示请求已经结束;如果用户已经登录,则返回true,表示请求可以继续进行。
配置拦截器
在SpringMVC的配置文件中配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/order/**" />
<bean class="com.example.LoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
在上面的配置中,我们配置了一个拦截器LoginInterceptor,并将其应用于所有/order/**路径的请求中。在这个示例中,我们假设所有需要登录的请求都以/order/开头。
创建一个Controller
@Controller
@RequestMapping("/order")
public class OrderController {
@RequestMapping(value = "/create", method = RequestMethod.POST)
public String createOrder(Model model) {
// handle create order
return "order-success";
}
@RequestMapping(value = "/list", method = RequestMethod.GET)
public String listOrders(Model model) {
// handle list orders
return "order-list";
}
}
在上面的Controller中,我们包含了两个请求处理方法createOrder()和listOrders()。在createOrder()方法中,我们处理创建订单的请求,并在请求处理完成后返回一个视图名称order-success;在listOrders()方法中,我们处理列出订单列表的请求,并在请求处理完成后返回一个视图名称order-list。
测试拦截器
现在我们已经准备好测试拦截器是否工作了。我们可以通过登录页面来测试,如果用户没有登录,则请求将被重定向到登录页面;如果用户已经登录,则请求将被顺利处理,返回视图。
完整代码实现:https://github.com/linlinjava/litemall/tree/master/litemall-admin/src/main/java/org/linlinjava/litemall/admin/interceptor
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java SpringMVC实现自定义拦截器 - Python技术站