SSM项目中怎么使用拦截器和过滤器
本篇内容介绍了"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、配置拦截器
由于配置了
会拦截所有资源,我们必须用
标签放行静态资源和一些不用拦截的请求(登录等等)。
是第一步创建的拦截器。
3、测试下拦截器:
在地址栏输入个非法的请求试试
通过地址栏可以看到,页面已经被重定向到了登陆界面,拦截成功。
但是拦截器并不能拦截jsp页面的访问,这个时候两种选择:
1、将所有jsp页面都放在WEB-INF目录下
2、用Servlet过滤器(虽然感觉技术有点老了)
三、过滤器概述
Servlet过滤器主要用于对客户端(浏览器)的请求进行过滤处理,然后将过滤后的请求转交给下一资源。
四、过滤器配置步骤
1、创建一个过滤器(实现Filter接口)
package com.ssm.Filter;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.IOException;//自定义过滤器public class LoginFilter implements Filter { //初始化方法 @Override public void init(FilterConfig filterConfig) throws ServletException { //初始化处理 System.out.println("过滤器初始化"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //过滤处理 //servletRequest 是个接口,HttpServletRequest 是实现,但是有些方法是HttpServletRequest独有的,如:getSession //HttpServletRequest接口是继承servletRequest接口,增加了和http相关的方法 HttpServletRequest request= (HttpServletRequest) servletRequest; HttpServletResponse response= (HttpServletResponse) servletResponse;// String requestURI=request.getRequestURI();// System.out.println("链接:"+requestURI+"进入过滤器"); HttpSession session=request.getSession(); if(session.getAttribute("USERINFO")==null){ //非法请求,直接跳转到登陆界面 String serverPath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/index.jsp"; response.sendRedirect(serverPath); }else{ //正常登录,放行 filterChain.doFilter(request,response); } } @Override public void destroy() { //释放资源 System.out.println("过滤器销毁"); }}
2、配置web.xml
LoginFilter com.ssm.Filter.LoginFilter LoginFilter /views/*
各个标签的解释都写在注释里面了,至于需要过滤的资源,你可以根据自己的需求再添加
,我主要是想把views目录下面的jsp全部过滤。
"SSM项目中怎么使用拦截器和过滤器"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!