SSM拦截器和过滤器结合使用-实现登录拦截操作

我的主要思路是:使用过滤器filter实现对前台页面的拦截(包括.jsp、css、images、js),使用拦截器interceptor实现对后台所有请求的拦截(登陆请求除外)。

文件位置如下,下图是过滤器和拦截器类的位置:
在这里插入图片描述
web.xml文件是对filter过滤器的配置:
springmvc-config.xml是对interceptor拦截器的配置:
在这里插入图片描述

下面是filter过滤器在web.xml中的配置如下:

  <!--  使用filter 实现登陆控制 -->
  <filter>
    <filter-name>SessionFilter</filter-name>
    <filter-class>com.yyf.filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>SessionFilter</filter-name>
    <url-pattern>/jsp/*</url-pattern>
    <url-pattern>/css/*</url-pattern>
    <url-pattern>/images/*</url-pattern>
    <url-pattern>/js/*</url-pattern>
  </filter-mapping>

解释:filter标签下的两个子标签,filter-name和filter-class。其中
filter-name标签是拦截器的名字,filter-class标签是拦截器类所在的类路径。
filter-mapping标签中的url-pattern标签,是拦截指定路径下的动态和静态资源。
拦截过程:当用户发出请求,首先将会经过filter过滤s器中的url-pattern标签进行路径匹配,如果匹配上了,就执行filter-class类路径下的LoginFilter类,在该类中获取用户名,如果为空,请求转发到登录页面,如果不为空,则放行,继续执行下一个请求。

下面是LoginFilter类内容如下:

package com.yyf.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 {
        // 过滤器出生
    }

    @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,indexOf(),  求字符串中路径出现的位置下标
        HttpSession session = request.getSession();
        String userName = (String) session.getAttribute("UserName");
        if (userName == null) {
            //  没有登录
            request.setAttribute("msg", "您还没有登录,请先登录!");
            request.getRequestDispatcher("/loginForm.jsp").forward(request, response);
        } else {
            // 已经登录,继续下一个请求(继续访问)
            filterChain.doFilter(request,response);
        }
    }

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

下面是拦截器interceptor在springmvc-config.xml中的配置:

    <!-- 拦截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--拦截全部的请求信息-->
            <mvc:mapping path="/admin/*"/>
            <!--不拦截登陆页面的请求-->
            <mvc:exclude-mapping path="/admin/login"/>
            <bean class="com.yyf.interceptor.LoginInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

下面是拦截器interceptor类:

package com.yyf.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 url = request.getRequestURI();
        if(url.indexOf("loginForm.jsp")>=0){
            return true;
        }
        // 获取Session
        HttpSession session = request.getSession();
        String userName = (String) session.getAttribute("UserName");
        // 判断Session中是否有用户数据,如果有,则返回true,继续向下执行
        if(userName != null){
            return true;
        }
        // 不符合条件的给出提示信息,并转发到登录页面
        request.setAttribute("msg", "您还没有登录,请先登录!");
        request.getRequestDispatcher("/loginForm.jsp").forward(request, response);
        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 {
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值