之前在网上搜了很多登录拦截的资料,但是没有一个成功。主要是自己太笨,所以导致浪费大量时间。下面进入正题
首先我们创建一个新的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>
上方只是案例。如果还有什么不明白的可以联系我或者在下方留言。