Spring Boot登录拦截

    之前在网上搜了很多登录拦截的资料,但是没有一个成功。主要是自己太笨,所以导致浪费大量时间。下面进入正题
    首先我们创建一个新的SpringBoot工程,记得点web开发,然后导入jar包。再在启动类上加两个注解

    @EnableScheduling
    @Configuration
 

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

接着创建两个重要的类WebConfig和Interceptor


1.WebConfig如下:

package com.login.logindemo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    //@Autowired
    //LogInterceptor logInterceptor;

    @Autowired
    LoginInterceptor loginInterceptor;

    /**
     * 不需要登录拦截的url:登录注册和验证码
     */
    final String[] notLoginInterceptPaths = {"/login/**","/index/**"};

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 日志拦截器
        //registry.addInterceptor(logInterceptor).addPathPatterns("/**");
        // 登录拦截器
        registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns(notLoginInterceptPaths);
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/static/");
        resolver.setSuffix(".html");
        resolver.setViewClass(JstlView.class);
        return resolver;
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {

    }
    }


2.Interceptor如下:

package com.login.logindemo;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.HashSet;
import java.util.Set;

@Controller
@Component
public class LoginInterceptor extends HandlerInterceptorAdapter {

    Logger log = Logger.getLogger(LoginInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        String basePath = request.getContextPath();
        String path = request.getRequestURI();
        if(!doLoginInterceptor(path, basePath) ){//是否进行登陆拦截
            return true;
        }
        //如果登录了,会把用户信息存进session
        HttpSession session = request.getSession();
        User users =  (User) session.getAttribute("userList");

        //开发环节的设置,不登录的情况下自动登录
        if(users==null){

            String requestType = request.getHeader("X-Requested-With");
            if(requestType!=null && requestType.equals("XMLHttpRequest")){
                response.setHeader("sessionstatus","timeout");
                response.getWriter().print("LoginTimeout");
                return false;
            } else {
                log.info("尚未登录,跳转到登录界面");
                response.sendRedirect(request.getContextPath()+"Login.html");
            }
            return false;
        }
        return true;
    }

    /**
     * 是否进行登陆过滤
     * @param path
     * @param basePath
     * @return
     */
    private boolean doLoginInterceptor(String path,String basePath){
        path = path.substring(basePath.length());
        Set<String> notLoginPaths = new HashSet<>();
        //设置不进行登录拦截的路径:登录注册和验证码。这里可以自定义一些自己拦截的需求。
        notLoginPaths.add("/Login.html");
        notLoginPaths.add("/index");
        notLoginPaths.add("/signin");
        notLoginPaths.add("/login");
        notLoginPaths.add("/register");
        notLoginPaths.add("/kaptcha.jpg");
        notLoginPaths.add("/kaptcha");

        if(notLoginPaths.contains(path)) return false;
        return true;
    }
    }


3.记得最开始先创建个实体类User参数自定义哈,为了方便我就只弄了两参数

package com.login.logindemo;

public class User {
    private String userName;
    private String passWord;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
    }


4.LoginController层如下:

package com.login.logindemo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@Controller
public class LoginController {

    @RequestMapping("/login")
    @ResponseBody
    public String login(String userName, String passWord, HttpServletRequest request){
        if(userName!=null&&passWord!=null){
            if(userName.equals("admin")&&passWord.equals("123")){
                HttpSession session = request.getSession();
                User user=new User();
                user.setUserName(userName);
                user.setPassWord(passWord);
                session.setAttribute("userList",user);
                return "chengong";
            }
            return "shibai";
        }
        return "shibai";
    }
    }


5.还有两个页面login.html:```

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<body>
<form action="" method="post">
    <input type="text" name="userName" id="userName"><br>
    <input type="password" name="passWord" id="passWord"><br>
    <input type="button" value="登录" onclick="fanFa();"><span id="tishi"></span>
</form>

</body>
<script type="text/javascript">
    function fanFa(){
        var user = $("#userName").val();
        var pass = $("#passWord").val();
        $.ajax({
            url:"/login",
            type:"POST",
            data:{"userName":user,"passWord":pass},
            success:function (data) {
                if(data=="chengong"){
                    window.location="CG.html";
                }else {
                    $("#tishi").text("账号或密码错误!");
                }
            }
        })
    }
</script>
</html>

6.成功页面CG.html:


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
成功!
</body>
</html>

上方只是案例。如果还有什么不明白的可以联系我或者在下方留言。

猜你喜欢

转载自blog.csdn.net/qq_23120073/article/details/84873153