SSM项目中使用拦截器和过滤器
一、拦截器概述
Spring MVC 也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定 的功能,自定义的拦截器必须实现 HandlerInterceptor 接口
preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求 request 进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他 的拦截器,或者是业务处理器去进行处理,则返回 true;如果程序员决定不需要 再调用其他的组件去处理请求,则返回 false。
postHandle():这个方法在业务处理器处理完请求后,但是 DispatcherServlet向客户端返回响应前被调用,在该方法中对用户请求 request 进行处理。
afterCompletion():这个方法在 DispatcherServlet 完全处理完请求后被调用,可以 在该方法中进行一些资源清理的操作。
二、拦截器配置步骤
1、创建一个拦截器(实现HandlerInterceptor接口)
package com.ssm.Interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//拦截器
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取请求的URL
String requestURI=request.getRequestURI();
HttpSession session=request.getSession();
Object userInfo=request.getSession().getAttribute("USERINFO");
System.out.println("链接:"+requestURI+"进入拦截器");
if(userInfo==null){ //表示未登录就想进入系统
//直接重定向到登录界面
String serverPath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/index.jsp";
response.sendRedirect(serverPath);
return false;
}else{
//登陆成功,不拦截
return true;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("跳转后拦截");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("渲染后拦截");
}
}
这个拦截器我只是写个Demo,所以只进行了是否登录的验证,真正的项目中你也可以在这里进行一些权限的判断等等。
2、配置拦截器
<!--拦截器配置-->
<mvc:interceptors>
<!--后台访问拦截器-->
<mvc:interceptor>
<!--拦截所有资源-->
<mvc:mapping path="/**"/>
<!--登陆不拦截-->
<mvc:exclude-mapping path="/user/login"/>
<!--邮箱激活不拦截-->
<mvc:exclude-mapping path="/user/activeEmail"/>
<!--静态资源的目录不拦截-->
<mvc:exclude-mapping path="/commons/**"/>
<!--用户通过邮箱中重置密码的链接不拦截-->
<mvc:exclude-mapping path="/email/resetPassword"/>
<!--激活邮箱的验证不拦截-->
<mvc:exclude-mapping path="/user/validateCode"/>
<!--实现拦截功能的类-->
<bean class="com.ssm.Interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
由于配置了<mvc:mapping path="/**"/>会拦截所有资源,我们必须用<mvc:exclude-mapping path="/这里写你想放行的请求">标签放行静态资源和一些不用拦截的请求(登录等等)。<bean class="com.ssm.Interceptor.LoginInterceptor"></bean>是第一步创建的拦截器。
3、测试下拦截器:
在地址栏输入个非法的请求试试:
在这里插入图片描述
在这里插入图片描述
通过地址栏可以看到,页面已经被重定向到了登陆界面,拦截成功。
但是拦截器并不能拦截jsp页面的访问,这个时候两种选择:
1、将所有jsp页面都放在WEB-INF目录下
2、用Servlet过滤器(虽然感觉技术有点老了)
三、过滤器概述
Servlet过滤器主要用于对客户端(浏览器)的请求进行过滤处理,然后将过滤后的请求转交给下一资源。
————————————————
版权声明:本文为CSDN博主「别团等shy哥发育」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43753724/article/details/115773211
- 点赞
- 收藏
- 关注作者
评论(0)