SSM框架使用拦截器和过滤器实现登录的拦截

SSM框架使用拦截器和过滤器实现登录的拦截

在ssm的普通项目中登录如不进行拦截操作,那么通过虚拟路径进行跨页面展示是十分危险的,安全起见需要需要进行登录的拦截,如果没有登录(没有包含用户信息)那么强制跳转到登录页面,不允许没有登陆即访问其他页面。
过滤器和拦截器区别:

  1. 使用范围不同: Filter 是Servlet规范规定的,所以过滤器只能用于Web程序中。而拦截器既可以用于Web程序,也可以用于Application、Swing 程序中。
  2. 规范不同:过滤器 Filter是在Servlet规范中定义的,是Servlet容器支持的。而拦截器是在Spring容器内的,是Spring框架支持的。chenleixing
  3. 使用的资源不同:同其他的代码块一样, 拦截器也是一个Spring的组件,归Spring管理,配置在Spring文件中,因此能使用Spring里的任何资源、对象,例如Service对象、数据源、事务管理等,通过IoC注入到拦截器即可;而过滤器 Filter则不能。
  4. 深度不同: 过滤器-Filter 在只在Servlet前后起作用。而拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。所以在Spring构架的程序中,要优先使用拦截
    范围图解

进入正题:

进行登录拦截需要创建两个类并分别配置
在这里插入图片描述

  1. 创建拦截器类并实现拦截器 HandlerInterceptor 接口
package com.wu.config;

import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginHandlerInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 登录成功应该有session(在登陆的Controller中设置session)
        Object admin = request.getSession().getAttribute("admin");
        System.out.println(admin);
        if (admin == null){
            request.setAttribute("msg", "没有权限,请先登录!");
            request.getRequestDispatcher("/admin/login.jsp").forward(request, response);
            return false;
        }else {
            return true;
        }
    }
}

  1. 在我们的springmvc.xml中配置拦截器类
    <!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
        	// 所有请求都拦截
            <mvc:mapping path="/**"/>
            // 放行登录界面和登陆请求
            <mvc:exclude-mapping path="/admin/login.jsp"/>
            <mvc:exclude-mapping path="/admin/login.action"/>
            // 拦截器类的位置
            <bean class="com.wu.config.LoginHandlerInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
  1. 创建过滤器类并实现 Filter 接口
package com.wu.config;

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

public class LoginFiler implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        Object admin = request.getSession().getAttribute("admin");
        if(admin == null && request.getRequestURI().indexOf("/admin/login.action") == -1){
            // 没有登录 强制跳转到登录页面
            request.getRequestDispatcher("/admin/login.jsp").forward(request, response);
        }else{
            // 已经登录,继续请求下一级资源(继续访问)
            filterChain.doFilter(request, response);
        }

    }

    @Override
    public void destroy() {

    }
}

  1. 在web.xml中对过滤器进行配置
  <filter>
    <filter-name>SessionFilter</filter-name>
    <filter-class>com.wu.config.LoginFiler</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>SessionFilter</filter-name>
    // admin下的所有请求和页面都要过滤
    <url-pattern>/admin/*</url-pattern>
  </filter-mapping>

配置完成了,简单四步实现对于登录的拦截操作,想要不登录访问其他界面是不可能了,新手上路 有错误大家多多指教
在这里插入图片描述

  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值