ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

通过Interceptor拦截器实现未登录请求拦截

2021-01-25 22:29:34  阅读:154  来源: 互联网

标签:拦截器 return 登录 request public Interceptor 拦截 页面


拦截器可以拦截请求,通常用于验证登录,验证权限等。
下面用一个例子来了解一下如何用拦截器进行登录权限验证和拦截。

首先要创建一个LoginController 一个拦截器 LoginInterceptor

先要明确思路,首先要进入一个首页,可以选择进入登录页面和进入功能性页面
那么首先写出登录页面和功能性页面

    @RequestMapping("/gologin")
    public String goLogin(){
        return "Login";
    }

    @RequestMapping("/login")
    public String Login(String username, String password, HttpSession session){
        if("曾木欠".equals(username)&&"fzlfzl".equals(password)) {
            //把用户的信息存到Session中
            session.setAttribute("userLoginInfo", username);
            return "LoginSuccess";
        }
        return "LoginFaild";
    }

这是一个登录页面,判断用户名和密码是否正确。
然后写一个功能性页面

    @RequestMapping("/main")
    public String goMain(){
        return "main";
    }

接下来就是写这两个页面的JSP页面
首先是登录页:

<%--
  Created by IntelliJ IDEA.
  User: shadowpee
  Date: 2021/1/25
  Time: 20:53
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--在WEB-INF下的所有页面和资源,只能通过Controller,或者Servlet进行访问--%>

<h1>登录页面</h1>

<form action="${pageContext.request.contextPath}/Log/login" method="post">
    用户名:<input type="text" name="username"/>
    密码:<input type="text" name="password"/>
    <input type="submit" value="提交">
</form>

</body>
</html>

然后是功能页:

<%--
  Created by IntelliJ IDEA.
  User: shadowpee
  Date: 2021/1/25
  Time: 21:11
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>首页</title>
    <style type="text/css">
        a {
            text-decoration: none;
            color: #000000;
            font-size: 18px;
        }
        h3 {
            width: 180px;
            height: 38px;
            margin: 100px auto;
            text-align: center;
            line-height: 38px;
            background: deepskyblue;
            border-radius: 4px;
        }
    </style></title>
</head>
<body>
<h3>
    <a href="${pageContext.request.contextPath}/book/allBook">点击进入列表页</a>
</h3>
</body>
</html>

登录页的登陆成功或者失败分别指向两个页面,这也决定了是否给请求赋值Session
失败页面:

<%--
  Created by IntelliJ IDEA.
  User: shadowpee
  Date: 2021/1/25
  Time: 21:34
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登陆失败</title>
</head>
<body>
<h1>登陆失败</h1>
<h3>
<a href="${pageContext.request.contextPath}/Log/gologin">回到登录页面</a>
</h3>
</body>
</html>

成功页面:

<%--
  Created by IntelliJ IDEA.
  User: shadowpee
  Date: 2021/1/25
  Time: 21:00
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>登陆成功!</h3>

<h3>
    <a href="${pageContext.request.contextPath}/Log/main">进入首页</a>
</h3>
</body>
</html>

此时页面都写完了,登录的时候无论输入的是不是正确的账户名和密码都可以进入功能性页面main,那么就需要一个拦截器,来拦截没有Session的请求,也就是没有登录不允许访问功能性页面。

创建一个拦截器:LoginInterceptor

package total.config;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //首先做放行判断:请求Session中有用户数据

        if(request.getSession().getAttribute("userLoginInfo")!=null){
            System.out.println("用户已经登录 放行");
            return true;
        }else if(
                //登录页的请求放行
                request.getRequestURI().contains("login")){
            System.out.println("进入登陆界面 放行");
            return true;
        }
        //判断什么情况下没有登录 (没有Session) 不放行
        else{
            //如果没有登录 那么久跳转到登录页面
            System.out.println("用户没有登录 不放行");
            request.getRequestDispatcher("/WEB-INF/jsp/Login.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 {

    }
}

Session不为空(已登录)的请求放行,进入login界面的请求放行,其他的请求不放行并跳转到登录页面。这就可以拦截未登录的请求去访问功能性页面。

然后就是在spring-mvc.xml中注册这个拦截器:

    <!--拦截器配置-->
    <!--登录拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- /** 包括该请求下的所有请求-->
            <mvc:mapping path="/Log/**"/>
            <!--让哪个拦截器类来执行过滤-->
            <bean class="total.config.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

这样拦截器就生效了,下面开启Tomcat服务器来试验一下:

首先进入初始页面:
在这里插入图片描述
点击进入首页,这时我们是没有登录的,那么就会自动跳转到登录页面:
输入错误的密码
在这里插入图片描述
会进入登录失败页面:
在这里插入图片描述
输入正确的密码:
在这里插入图片描述
登陆成功,并允许我们访问功能页:
在这里插入图片描述
进入功能页:
在这里插入图片描述
在这里插入图片描述
到此,拦截器功能成功,未登录就无法访问功能页面并自动跳转到登录页面。

标签:拦截器,return,登录,request,public,Interceptor,拦截,页面
来源: https://blog.csdn.net/weixin_44976835/article/details/113145634

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有