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接口。提供了这个接口中所有方法的空实现。
如下我们写出两个拦截器的示例代码,仅供大家参考:
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. 部署并验证