SpringBoot拦截器实现登录拦截的方法示例

网友投稿 303 2022-12-27


SpringBoot拦截器实现登录拦截的方法示例

源码

github:https://github.com/291685399/springboot-learning/tree/master/springboot-interceptor01

SpringBoot拦截器可以做什么

可以对URL路径进行拦截,可以用于权限验证、解决乱码、操作日志记录、性能监控、异常处理等

SpringBoot拦截器实现登录拦截

pom.xml:

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

org.springframework.boot

spring-boot-starter-parent

2.0.0.RELEASE

com.wyj

springboot-interceptor01

0.0.1-SNAPSHOT

springboot-interceptor01

springboot拦截器

1.8

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-test

test

org.springframework.boot

spring-boot-devtools

runtime

true

org.projectlombok

lombok

true

org.springframework.boot

spring-boot-starter-thymeleaf

springboot-interceptor01

org.springframework.boot

spring-boot-maven-plugin

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

org.springframework.boot

spring-boot-starter-parent

2.0.0.RELEASE

com.wyj

springboot-interceptor01

0.0.1-SNAPSHOT

springboot-interceptor01

springboot拦截器

1.8

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-test

test

org.springframework.boot

spring-boot-devtools

runtime

true

org.projectlombok

lombok

true

org.springframework.boot

spring-boot-starter-thymeleaf

springboot-interceptor01

org.springframework.boot

spring-boot-maven-plugin

WebMvcConfigurer:继承WebMvcConfigurationSupport类,重写addInterceptors方法

/**

* 在springboot2.0.0之后,WebMvcConfigurerAdapter已经过时了

* 会使用WebMvcConfigurer或者WebMvcConfigurationSupport替代

*

* @author wyj

* @create 2019-06-01 21:48

*/

@Configuration

public class WebMvcConfigurer extends WebMvcConfigurationSupport {

/**

* 在springboot2.0.0之前继承WebMvcConfigurerAdapter类,重写addInterceptors方法

*

* @param registry

*/

// @Override

// public void addInterceptors(InterceptorRegistry registry) {

// /**

// * 拦截器按照顺序执行,如果不同拦截器拦截存在相同的URL,前面的拦截器会执行,后面的拦截器将不执行

// */

// registry.addInterceptor(new AuthorityInterceptor())

// .addPathPatterns("/user/**");

// super.addInterceptors(registry);

// }

/**

* 在springboot2.0.0之后实现WebMvcConfigurer接口,重写addInterceptors方法

*

* @param registry

*/

// @Override

// public void addInterceptors(InterceptorRegistry registry) {

// /**

// * 拦截器按照顺序执行,如果不同拦截器拦截存在相同的URL,前面的拦截器会执行,后面的拦截器将不执行

// */

// registry.addInterceptor(new AuthorityInterceptor())

// .addPathPatterns("/user/**");

// }

/**

* 在springboot2.0.0之后继承WebMvcConfigurationSupport类,重写addInterceptors方法

*

* @param registry

*/

@Override

protected void addInterceptors(InterceptorRegistry registry) {

/**

* 拦截器按照顺序执行,如果不同拦截器拦截存在相同的URL,前面的拦截器会执行,后面的拦截器将不执行

*/

registry.addInterceptor(new AuthorityInterceptor())

.addPathPatterns("/user/**");

super.addInterceptors(registry);

}

}

AuthorityInterceptor:实现HandlerInterceptor接口,重写preHandle、postHandle、afterCompletion方法

preHandle:在请求处理之前进行调用(Controller方法调用之前)

postHandle:请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)

afterCompletion:在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)

@Slf4j

public class AuthorityInterceptor implements HandlerInterceptor {

private static final Set NOT_INTERCEPT_URI = new HashSet<>();//不拦截的URI

static {

NOT_INTERCEPT_URI.add("/user/login.html");

NOT_INTERCEPT_URI.add("/user/login");

}

/**

* 在请求处理之前进行调用(Controller方法调用之前)

*/

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response,

Object object) throws Exception {

String uri = request.getRequestURI();

if (NOT_INTERCEPT_URI.contains(uri)) {

log.info("不拦截" + uri);

return true;

}

log.info("拦截" + uri);

HttpSession session = request.getSession();

UserInfo userInfo = (UserInfo) session.getAttribute("user_info_in_the_session");

if (userInfo == null) {

throw new RuntimeException("用户未登陆");

}

return true;

}

/**

* 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)

*/

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView mv) throws Exception {

}

/**

* 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行

* (主要是用于进行资源清理工作)

*/

@Override

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception ex) throws Exception {

}

}

UserController:

@Controller

@RequestMapping(value = "/user")

public class UserController {

@RequestMapping(value = "/login.html")

public String index() {

return "login";

}

@RequestMapping(value = "/login")

public String login(User user) {

//查询数据库,我这里直接写死

User dbUser = new User(1, "zhangsan", "123456", "admin");

if (dbUser.getPassword().equals(user.getPassword())) {

UserInfo userInfo = new UserInfo(dbUser.getId(), dbUser.getUsername(), dbUser.getRole());

HttpSession session = getRequest().getSession();

session.setAttribute("user_info_in_the_session", userInfo);

return "admin";

}

return "login";

}

@RequestMapping(value = "/userInfo")

@ResponseBody

public String userInfo() {

HttpSession session = getRequest().getSession();

UserInfo userInfo = (UserInfo) session.getAttribute("user_info_in_the_session");

return userInfo.toString();

}

private HttpServletRequest getRequest() {

return ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();

}

}

User:

@Data

@NoArgsConstructor

@AllArgsConstructor

public class User implements Serializable {

private int id;

private String username;

private String password;

private String role;

}

UserInfo: 用于存在用户信息储存在session中

@Data

@NoArgsConstructor

@AllArgsConstructor

public class UserInfo implements Serializable {

private int id;

private String username;

private String role;

}

login.html:只是一个很简单的登录表单

登陆:

用户名:

密   码:

admin.html:

http://


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java初始化块及执行过程解析
下一篇:usb api测试工具(usb速度测试工具)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~