博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot~使用javaConfig的形式扩展WebMvcConfigurer配置, 实现自定义拦截器、默认转发、自定义视图解析器
阅读量:4051 次
发布时间:2019-05-25

本文共 3575 字,大约阅读时间需要 11 分钟。

文章目录

  • 在使用SpringBoot项目的时候, 虽然默认配置极大的简化了我们的开发效率, 但是有些功能比如拦截器是避免不了需要我们自己实现的

实现自定义拦截器

  • 首先需要创建一个类去实现HandlerInterceptor, 然后重写其perHandle方法
public class MyInterceptor implements HandlerInterceptor {
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取session, 只要有session就放行 HttpSession session = request.getSession(false); if (session == null) {
//没有设置session不放行 request.setAttribute("msg", "请登录"); request.getRequestDispatcher("/index.html").forward(request, response); return false; } User user = (User) session.getAttribute("user"); if (user == null) {
//说明没有登陆不放行 request.setAttribute("msg", "请登录"); request.getRequestDispatcher("/index.html").forward(request, response); return false; } else {
//放行 return true; } }}
  • 我们需要一个使用javaConfig形式的配置类去实现WebMvcConfig接口, 去告诉SpringBoot这是一个WebMvc的配置配
@Configurationpublic class MyMvcConfiguration implements WebMvcConfigurer {
//实现拦截器 @Override public void addInterceptors(InterceptorRegistry registry) {
System.out.println("[DEBUG_INTERCEPTOR]===>"); //添加自定义拦截器, 匹配/**表示所有请求, 但是除了后面那些"/login", "/index.html", "/", "/css/**", "/js/**", "/img/**" registry.addInterceptor(new MyInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/login", "/index.html", "/", "/css/**", "/js/**", "/img/**"); }}
  • 编写controller和登录页面进行测试
@Controllerpublic class LoginController {
@RequestMapping("/login") public String login(HttpSession session, @RequestParam("username")String name, @RequestParam("password")String pwd, Model model) {
if (name.equals(pwd)) {
//说明账号密码正确 User user = new User(name, pwd); session.setAttribute("user", user); model.addAttribute("msg", name); return "home"; } else {
//说明账号密码不正确 model.addAttribute("msg", "账号或密码不正确"); return "index"; } } //如果不进行登录, 这个路径的请求应该被拦截器拦截下来 @RequestMapping("home") public String home() {
return "home"; }}
  • 直接访问/home是进不去的
    在这里插入图片描述
  • 登录后访问就可以进行
    在这里插入图片描述

默认转发

  • 默认转发就是在拦截器不拦截的请求路径下或者是已经放行的请求路径下, 并且想要访问templates目录下的资源的时候就可以使用这个实现
//实现路径转发, 只要访问index.html这个路径就过度到templates路径下的index.html    @Override    public void addViewControllers(ViewControllerRegistry registry) {
System.out.println("[DEBUG_VIEW]===>"); registry.addViewController("/index.html").setViewName("index"); }
  • 这个的意思就是如果想访问/index.html, 但是我这个资源在templates目录下,使用这样的方式就可以访问到

自定义视图解析器

  • 在SpringBoot中默认自带了几个视图解析器, 但是如果我们想要额外增加也是可以的, 但是需要将这个视图解析器这个组件以bean的形式返回给spring的IOC中
//实现额外组件生成, 生成一个额外的视图解析器, 并以bean的形式返回到spring中    @Bean    public ViewResolver myViewResolver() {
return new MyViewResolver(); } static class MyViewResolver implements ViewResolver {
@Override public View resolveViewName(String s, Locale locale) throws Exception {
return null; } }
  • SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(用户自己配置则组件记得@bean形式返回),如果有就用用户配置的,如果没有就用自动配置的;
  • 如果有些组件可以存在多个,比如我们的视图解析器,就将用户配置的和自己默认的组合起来!

总结

  • 在实现扩展的时候要特别注意, 只需要在扩展类中使用@Configuration这个注解表示这是一个javaConfig形式得配置类即可, 接下来只需重写对应接口中的方法, 然后如果是额外实现的组件就将组件以@Bean的形式返回,如果只是想改变某些实现方式, 那么只需要重写接口中对应的方法, 千万不敢直接使用注解@EnableXXX注解, 因为这个注解会使springBoot中的对应的配置类完全失效
  • 如果非要使用这个@EnableXXX注解那么,SpringBoot就不管你了, 你就需要自己完全实现所有的配置

转载地址:http://knsci.baihongyu.com/

你可能感兴趣的文章
Python自动化之pytest框架使用详解
查看>>
【正则表达式】以个人的理解帮助大家认识正则表达式
查看>>
性能调优之iostat命令详解
查看>>
性能调优之iftop命令详解
查看>>
非关系型数据库(nosql)介绍
查看>>
移动端自动化测试-Windows-Android-Appium环境搭建
查看>>
Xpath使用方法
查看>>
移动端自动化测试-Mac-IOS-Appium环境搭建
查看>>
Selenium之前世今生
查看>>
Selenium-WebDriverApi接口详解
查看>>
Selenium-ActionChains Api接口详解
查看>>
Selenium-Switch与SelectApi接口详解
查看>>
Selenium-Css Selector使用方法
查看>>
Linux常用统计命令之wc
查看>>
测试必会之 Linux 三剑客之 sed
查看>>
Socket请求XML客户端程序
查看>>
Java中数字转大写货币(支持到千亿)
查看>>
Java.nio
查看>>
函数模版类模版和偏特化泛化的总结
查看>>
VMware Workstation Pro虚拟机不可用解决方法
查看>>