Session实现登录(springboot项目)
代码实现
自定义一个拦截器
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