您的位置:首页 > 其它

三.SSM框架整合之过滤器Filter与拦截器Interceptor(登陆拦截)

2020-03-06 21:16 267 查看

过滤器:Filter
拦截器:Interceptor

过滤器与拦截器的区别:
1 拦截器(interceptor)只对action请求起作用,而过滤器(filter)则可以对几乎所有的请求起作用
2 过滤器是在请求进入容器(Tomcat)之后,但是请求进入Servlet之前。请求结束返回时也是,是在Servlet处理完之后,返回给前端之前


做一个登陆的拦截
创建类

package com.gm.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;

/**
* @author 起风
* @date 2020/3/2 9:51
*/
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//在拦截点执行拦截,如果返回的true则不执行拦截点后的操作(拦截成功)

//        1 判断当前的user用户不为空  获取当前的登陆方法
HttpSession session = request.getSession();
String url = request.getRequestURI();
System.out.println("接收到的action为:" + url);

if (session.getAttribute("userInfo") != null || url.indexOf("user/doLogin.do") != -1) {
//用户不为空,路径下标不为-1   不进行拦截
return true;
} else {
//进行拦截,返回登陆页面
response.sendRedirect(request.getContextPath() + "/user/doLogin.do");
return false;
}

}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//在处理过程中,执行拦截
}

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

}
}

去spring-mvc.xml 添加拦截器的配置

<!-- 4 配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截所有的mvc控制器-->
<mvc:mapping path="/**"/>

<!--放行机制,可以测试/指定对某一页面进行拦截-->
<mvc:exclude-mapping path="/user/doLogin.do"/>

<!--指定用那个拦截器-->
<bean class="com.gm.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>

测试
在页面中,未登陆,不可以直接进行路径的访问
登陆了 随意

过滤器实现

package com.gm.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
* @author 陈琳
* @date 2020/3/2 10:28
*/
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//过滤器出生
}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//servletRequest 是个接口,HttpServletRequest 是实现,但是有些方法是HttpServletRequest独有的,如:getSession
//HttpServletRequest接口是继承servletRequest接口,增加了和http相关的方法

//        强转得到想要的request和response
HttpServletRequest request= (HttpServletRequest) servletRequest;
HttpServletResponse response= (HttpServletResponse) servletResponse;

/*获取session*/
HttpSession session=request.getSession();

if (session.getAttribute("userinfo")==null &&request.getRequestURI().indexOf("/user/doLogin.do")==-1){
/*没有登陆*/
response.sendRedirect(request.getContextPath()+"/user/doLogin.do");
}else {
//登陆了,继续请求,不进行过滤操作
filterChain.doFilter(request,response);
}
}

@Override
public void destroy() {
//过滤器死亡
}
}

去web.xml添加配置

<!--使用filter 实现登陆控制-->
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>com.gm.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>

<!--拦截所有的页面  (自定义)-->
<url-pattern>/pages/*</url-pattern>
<url-pattern>*.jsp</url-pattern>
<url-pattern>/css/*</url-pattern>
<url-pattern>/img/*</url-pattern>
</filter-mapping>

测试,搞定

AOP:
拦截器和过滤器其实都是aop编程思想的实现,都可以提现权限检查,日志记录;但是不同之处:
1 适用范围不同:filter是Servlet规定规范规定的,只能用于web程序中,而拦截器既可以用于web中,也可以用于Application,Swing程序中
2 规范不同: filter是Servlet规定规范规定的,是Servlet容器支持的。拦截器是在Spring容器内的,是Spring框架支持的
3 使用资源不同
4 深度不同

在校大二学生,疫情在家学习网课,来此记录,有错请点出,谢谢。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
clzdq6666 发布了3 篇原创文章 · 获赞 0 · 访问量 71 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: