代码实现

自定义一个拦截器

package com.xl.sessionlogin.interceptor;

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

import org.springframework.web.servlet.HandlerInterceptor;

public class LoginInterceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		boolean result = false;
		try {
			result = (boolean)request.getSession().getAttribute("pass");
		} catch (Exception e) {
			e.printStackTrace();
		}
		if (result) {
			return true; // 放行
		}
		return false; // 拦截
	}
	
}

注册拦截器

package com.xl.sessionlogin.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.xl.sessionlogin.interceptor.LoginInterceptor;

/**
 * 	注册拦截器并添加配置
 * @author Administrator
 *
 */
@Configuration
public class MyConfig implements WebMvcConfigurer {

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(new LoginInterceptor())
				.addPathPatterns("/**") // 拦截所有
				.excludePathPatterns("/login"); //排除该登录地址或添加其他
		
	}
	
	
}

登录接口

package com.xl.sessionlogin.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/login")
public class LoginController {
	
	@RequestMapping("")
	public String login(HttpServletRequest request,String username, String password) {
		String re = "login success.......";
		
		if (validateAccount(username,password)) { //验证通过
			request.getSession().setAttribute("pass", true);
		} else {
			request.getSession().invalidate(); // 作废当前session
			re = "login failed......";
		}
		return re;
	}
	
	/**
	 *  	验证账号
	 * @param username
	 * @param password
	 * @return true:通过, false:不通过
	 */
	private boolean validateAccount(String username, String password) {
		if (username.length() == password.length())
			return true;
		return false;
	}
	
	
}

业务接口,只有成功登录的用户才能访问

package com.xl.sessionlogin.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/homepage")
public class HomepageController {
	
	@RequestMapping("/logic")
	public String busiLogic() {
		
		return "bussiness logic...";
	}
}

测试

启动项目,

直接访问业务接口。由于未登录,请求地址会被拦截,所以预期是不会返回“bussiness logic…”的

在这里插入图片描述

登录

登录失败

在这里插入图片描述
访问业务接口,因为登录失败,肯定是无法访问的

在这里插入图片描述

登录成功

在这里插入图片描述
访问业务接口,预期会返回字符串“bussiness logic…”
在这里插入图片描述

注:以上只是利用了拦截器和session实现了最简单、最基本的功能,具体的业务根据实际情况进行添加、修改

附:

关于session

服务器可以为每个用户浏览器创建一个会话对象(session对象),一个浏览器只能产生一个session,当新建一个窗口访问服务器时,还是原来的那个session。session中默认保存的是当前用户的信息。因此,在需要保存其他用户数据时,我们可以自己给session添加属性。session(会话)可以看为是一种标识,通过带session的请求,可以让服务器知道是谁在请求数据。

参考:https://blog.csdn.net/qq_29025955/article/details/126452582

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐