今天在做springboot登录页面的拦截器时积累了一些经验,使用的是session原理。
####话不多说,直接上代码

###首先定义Interceptor类
package com.example.demo.Interceptor;
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 {
@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;
}
HttpSession session = request.getSession(true);
//获取登录时设置的session
Object username = session.getAttribute("userName");
if (null == username) {
String requestType = request.getHeader("X-Requested-With");
// System.out.println(requestType);
if(requestType!=null && requestType.equals("XMLHttpRequest")){
response.setHeader("sessionstatus","timeout");
// response.setHeader("basePath",request.getContextPath());
response.getWriter().print("LoginTimeout");
return false;
} else {
//页面重定向到登录页面
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");
notLoginPaths.add("/register");
notLoginPaths.add("/img");
return !notLoginPaths.contains(path);
}
}
###然后写WebConfig类
WebMvcConfigurerAdapter这个方法目前已经不是推荐方法
package com.example.demo.Interceptor;
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.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Autowired
LoginInterceptor loginInterceptor;
//这里设置的是未登录也不拦截的静态资源,注意接口也会被拦截
final String[] notLoginInterceptPaths = {"/login.html", "/login.css", "/login.js", "/register.html", "/register.css", "register.js", "/img/**","/superadmin/**"};
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 登录拦截器
registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns(notLoginInterceptPaths);
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/templates/");
resolver.setSuffix(".html");
resolver.setViewClass(JstlView.class);
return resolver;
}
}
####最后总结一下,过滤器和拦截器都可以实现页面的跳转,也可以通过respose.getWriter().print()的方法写js来进行页面的跳转。然后对于接口会被拦截,过滤这个问题需要注意一下。
本文分享了在SpringBoot项目中实现登录页面拦截的具体方法,采用Session原理,详细介绍了自定义Interceptor类及WebConfig配置,确保只有已登录用户才能访问特定页面。
7888

被折叠的 条评论
为什么被折叠?



