Spring中的拦截器

本文介绍了Spring MVC框架中的拦截器实现方法,包括实现HandlerInterceptor接口和继承HandlerInterceptorAdapter适配器的方式,并详细解释了preHandle、postHandle及afterCompletion三个核心方法的作用。此外,还提供了一个具体的登录验证拦截器实现案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring中的拦截器

定义spring拦截器两种基本方式

1. 实现接口:org.springframework.web.servlet.HandlerInterceptor。

接口中有如下方法需要重写:

注意:参数中的Object handler是下一个拦截器。

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

该方法在action执行前执行,可以实现对数据的预处理,比如:编码、安全控制等。

如果方法返回true,则继续执行action

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

该方法在action执行后,生成视图前执行。在这里,我们有机会修改视图层数据。

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

最后执行,通常用于释放资源,处理异常。我们可以根据ex是否为空,来进行相关的异常处理。因为我们在平时处理异常时,都是从底层向上抛出异常,最后到了spring框架从而到了这个方法中。

2. 继承适配器:
org.springframework.web.servlet.handler.HandlerInterceptorAdapter

这个适配器实现了HandlerInterceptor接口。提供了这个接口中所有方法的空实现。

 

如下我们写出两个拦截器的示例代码,仅供大家参考:

import javax.interceptor.Interceptors;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

 

public class MyInterceptor implements HandlerInterceptor {

@Override

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

System.out.println("最后执行!!!一般用于释放资源!!");

}

@Override

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

System.out.println("Action执行之后,生成视图之前执行!!");

}

@Override

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

System.out.println("action之前执行!!!");

return true;  //继续执行action

}

}

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import 

org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class MyInterceptor2 extends HandlerInterceptorAdapter {

@Override

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

System.out.println("MyInterceptor2.preHandle()");

return true;  //继续执行action

}

}

 

 

3. XML中如何配置。如下为示例代码:

<mvc:interceptors>

<bean class="com.sxt.interceptor.UseInterceptor"></bean><!--全局拦截器,此处配置可以拦截所有SpringMVC管理的请求-->

<mvc:interceptor>

<mvc:mapping path="/user.do" />

            <!-- /**是指定路径及其子路径 -->

<!--<mvc:mapping path="/**" />-->

<bean class="com.sxt.interceptor.MyInterceptor"></bean>      </mvc:interceptor>

           <!—可以有多个拦截器配置 -->

</mvc:interceptors>

 

使用拦截器实现登录验证

1. 编写登录页面login.jsp

<body>

  <form action="login.do" method="post">

   用户名:<input type="text" name="userName" id="userName" onblur="ceshi()"/><br>

   密码:<input type="password" name="password" /><br>

   <input type="submit" value="login">

  </form>

  </body>

 

2. 编写控制器UserController.java

@RequestMapping("/login")

public String login(User user,HttpSession session){

 

if(user.getUserName().equals("admin")&&user.getPassword().equals("admin")){

session.setAttribute("user", user);

return "redirect:/ok.jsp";

}else{

return "redirect:/login.jsp";

}

}

 

3. 编写登录拦截器 LoginInterceptor.java

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

 

public class LoginInterceptor implements HandlerInterceptor {

//允许通过的URL列表

private List<String> allowedPass;

 

@Override

public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object hander) throws Exception {

System.out.println("=======处理前=========");

String url=req.getRequestURL().toString();

//先判断是否存在Session

Object user=req.getSession().getAttribute("user");

//如果已登录,则进入后续处理

if(user!=null)

return true;

//遍历列表,确定请求路径是否可以通过

for(String temp:allowedPass){

if(url.endsWith(temp)){

return true;

}

}

resp.sendRedirect(req.getContextPath()+"/login.jsp");

return false;

}

 

@Override

public void postHandle(HttpServletRequest req, HttpServletResponse resp, Object hander, ModelAndView mav)

throws Exception {

}

 

@Override

public void afterCompletion(HttpServletRequest req, HttpServletResponse resp, Object hander, Exception arg3)

throws Exception {

System.out.println("=======处理完毕,可以释放资源=========");

}

 

//允许通过列表的Get/Set方法

public List<String> getAllowedPass() {

return allowedPass;

}

public void setAllowedPass(List<String> allowedPass) {

this.allowedPass = allowedPass;

}

 

}

 

 

4. 修改SpringMVC配置文件

<!-- 配置拦截器 -->

<mvc:interceptors>

<mvc:interceptor>

<!-- 要拦截的请求 -->

<mvc:mapping path="/**"/>

<bean class="wanshi.controller.LoginInterceptor">

<property name="allowedPass">

<list>

<value>login.do</value>

                      <!-- 可以添加多个过滤请求 -->

</list>

</property>

</bean>

</mvc:interceptor>

</mvc:interceptors>

 

5. 部署并验证

参考配置资料

拦截器:http://chengtong-java.iteye.com/blog/2302183

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值