java web 项目 实现 拦截器 和 过滤器 实例

实现用户登录过程的验证,用拦截器可以拦截用户没有登录的情况下,不能进行访问系统页面

以下是自定义拦截器工程目录实现的过程:

1:新建一个 interceptor 拦截器包,创建一个 LoginInterceptor 拦截器类

2:将这个类,继承 HandlerInterceptor 接口,并实现 HandlerInterceptor 这个接口的三个方法

 
  1. public class LoginInterceptor implements HandlerInterceptor {

  2.  
  3. @Override

  4. public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)

  5. throws Exception {

  6. // 执行完毕,返回前拦截

    扫描二维码关注公众号,回复: 12427736 查看本文章
  7. }

  8.  
  9. @Override

  10. public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)

  11. throws Exception {

  12. // 在处理过程中,执行拦截

  13. }

  14.  
  15. @Override

  16. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {

  17. // 在拦截点执行前拦截,如果返回true则不执行拦截点后的操作(拦截成功)

  18. // 返回false则不执行拦截

  19. HttpSession session = request.getSession();

  20. //String uri = request.getRequestURI(); // 获取登录的uri,这个是不进行拦截的

  21. //if(session.getAttribute("LOGIN_USER")!=null || uri.indexOf("ssm/login")!=-1) {// 说明登录成功 或者 执行登录功能

  22. if(session.getAttribute("LOGIN_USER")!=null) {

  23. // 登录成功不拦截

  24. return true;

  25. }else {

  26. // 拦截后进入登录页面

  27. response.sendRedirect(request.getContextPath()+"/login.html");

  28. return false;

  29. }

  30. }

  31. }


3:拦截器是要配置的,将这个类,配置在 spring-mvc.xml 的配置文件中,如下:

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

  2. <mvc:interceptors>

  3. <mvc:interceptor>

  4. <!-- 拦截所有mvc控制器 -->

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

  6. <!-- mvc:exclude-mapping是另外一种拦截,它可以在你后来的测试中对某个页面进行不拦截,这样就不用在

  7. LoginInterceptor的preHandler方法里面获取不拦截的请求uri地址了(优选) -->

  8. <!-- <mvc:exclude-mapping path="login.do" /> -->

  9. <bean class="com.ssm.interceptor.LoginInterceptor"></bean>

  10. </mvc:interceptor>

  11. </mvc:interceptors>

将登陆拦截器类 LoginInterceptor,配置到里面

这个拦截器有2个知识要点:

①:

<mvc:mapping path="/**"/> 是已经拦截了所有请求,包括登录,如果后来想不拦截某个页面,就在拦截配置里面配置 
<mvc:exclude-mapping path="/system/login" />

②:也可以不在配置文件里拦截某个页面请求,在拦截类里面获取拦截路径,然后做个判断

eg:

 
  1. //String uri = request.getRequestURI(); // 获取登录的uri,这个是不进行拦截的

  2. //if(session.getAttribute("LOGIN_USER")!=null || uri.indexOf("system/login")!=-1)

4:页面:

 
  1. <div align="center">

  2. <br><br><br>

  3. <form action="${pageContext.request.contextPath}/user/login" method="post">

  4. <p>用户登录</p>

  5. 账号:<input name="account" type="text" />

  6. <br><br>

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

  8. <br><br>

  9. <input type="reset" value="撤 销" />

  10. <input type="submit" value="提 交" />

  11. </form>

  12. </div>

拦截器已经实现了。

二:过滤器

过滤器就分两步:新建过滤器类,接着配置web.xml

1:

建一个LoginFilter 类,继承 Filter 类

 
  1. public class LoginFilter implements Filter {

  2.  
  3. @Override

  4. public void destroy() {

  5. // TODO Auto-generated method stub

  6.  
  7. }

  8.  
  9. @Override

  10. public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)

  11. throws IOException, ServletException {

  12. // TODO Auto-generated method stub

  13. HttpServletRequest request = (HttpServletRequest)arg0;

  14. HttpServletResponse response = (HttpServletResponse)arg1;

  15. HttpSession session = request.getSession();

  16.  
  17. if(session.getAttribute("LOGIN_USER")==null

  18. && request.getRequestURI().indexOf("/ssm/login") == -1){

  19. // 没有登录

  20. response.sendRedirect(request.getContextPath()+"/login.html");

  21. }else{

  22. // 已经登录,继续请求下一级资源(继续访问)

  23. arg2.doFilter(arg0, arg1);

  24. }

  25.  
  26. }

  27.  
  28. @Override

  29. public void init(FilterConfig arg0) throws ServletException {

  30. // TODO Auto-generated method stub

  31.  
  32. }

  33.  
  34. }

2:配置 web.xml ,在字符过滤器下面接着配置一个过滤器

 
  1.  
  2. <!-- 使用filter实现登录控制 -->

  3. <filter>

  4. <filter-name>sessionFilter</filter-name>

  5. <filter-class>com.lingshi.bookstore.filter.LoginFilter</filter-class>

  6. </filter>

  7. <filter-mapping>

  8. <filter-name>sessionFilter</filter-name>

  9. <!-- 所有的管理页面需要登录后才能访问 -->

  10. <url-pattern>*.html</url-pattern>

  11. </filter-mapping>

将过滤器类 LoginFilter.class 配置到过滤器配置文件中,即可完成 .

过滤器也实现了

猜你喜欢

转载自blog.csdn.net/dd2016124/article/details/109021195