13、springboot——CRUD登录和拦截③

一、登录跳转完成

  1、前端页面的设置

  login.html

<input type="text" name="username" class="form-control" placeholder="Username" th:placeholder="#{login.username}" required="" autofocus="">
           
<input type="password" name="password" class="form-control" placeholder="Password" th:placeholder="#{login.password}" required="">

  2、新建一个controller

@Controller
public class UserController {

    //@RequestMapping(value = "/user/login",method = RequestMethod.POST)
    @PostMapping(value = "/user/login")
    public String login(@RequestParam("username") String username,
                        @RequestParam("password") String password,
                        Map<String,Object> map){
        if(!StringUtils.isEmpty(username) && !StringUtils.isEmpty(password) && "123".equals(password)){
            //登录成功
            return "dashboard";
        }else{
            //登录失败
            map.put("msg","用户名密码错误");
            return "login";
        }
    }
}
@RequestMapping(value = "/user/login",method = RequestMethod.POST)
@PostMapping(value = "/user/login")

两个使用的效果是一样的!!!

  3、前端页面进行错误提示代码的检验

<p th:text="${msg}" style="color: red" th:if="${not #strings.isEmpty(msg)}"></p>

首先th:if判断是否存在,存在即执行th:text

登录成功之后有一个弊端,当刷新页面的时候依然执行的时登录时的请求
所以此时可以使用重定向

 首先将视图映射在MVC拓展类中进行配置

@Configuration
public class config  {
    @Bean
    public WebMvcConfigurer webMvcConfigurer(){
        return  new WebMvcConfigurer(){
            @Override
            public void addViewControllers(ViewControllerRegistry registry) {
                registry.addViewController("/").setViewName("index");
                registry.addViewController("/index.html").setViewName("index");
                registry.addViewController("/index").setViewName("index");
                registry.addViewController("/main.html").setViewName("dashboard");
            }
        };
    }
    //国际化
    @Bean()
    public LocaleResolver localeResolver(){
        return  new MyLocaleResolver();
    }
} 

 在进行修改LoginController的方法进行重定向

@Controller
public class UserController {

    //@RequestMapping(value = "/user/login",method = RequestMethod.POST)
    @PostMapping(value = "/user/login")
    public String login(@RequestParam("username") String username,
                        @RequestParam("password") String password,
                        Map<String,Object> map){
        if(!StringUtils.isEmpty(username) && !StringUtils.isEmpty(password) && "123".equals(password)){
            //登录成功,放置表单重复提交,可以重定向到主页,main.html在MVC配置类中设置了视图映射
            return "redirect:/main.html";
        }else{
            //登录失败
            map.put("msg","用户名密码错误");
            return "login";
        }
    }
}

这样进行重定向就不会出现重复提交表单问题了,但是现在这样也会出现问题,就是直接访问main.html就重定向到了页面,并没有登录

 这时我们就需要拦截器的作用

二、拦截器编写

1、编写拦截类:

LoginHandlerInterceptor实现  HandlerInterceptor 接口的方法进行拦截
/**
 * 登录检查
 */
public class LoginHandlerInterceptor implements HandlerInterceptor {

    //目标方法执行之前
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Object loginUser = request.getSession().getAttribute("loginUser");
        if(loginUser == null){
            //未登录,返回到登录页
            request.setAttribute("msg","没有权限,请先登录");
            request.getRequestDispatcher("/index.html").forward(request,response);
            return false;
        }else{
            //已登录,放行请求
            return true;
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

当然在登录成功后我们把登录的用户会放入session中

2、在MVC配置拓展类中进行注册拦截器(注册把静态资源的拦截排除,否则页面不出效果)

//实现WebMvcConfigurer接口以扩展springMVC的功能

//@EnableWebMvc     此标签表示全面接管springmvc配置,建议不使用
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    //添加视图映射
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //默认访问/和/index.html是访问静态资源路径下的index.html;
        //这里我们添加视图映射之后让其访问templates下的login.html(使用thymeleaf模板引擎)
        registry.addViewController("/").setViewName("login");
        registry.addViewController("/index.html").setViewName("login");
        registry.addViewController("/main.html").setViewName("dashboard");
    }


    //添加自定义的LocaleResolver
    @Bean
    public LocaleResolver localeResolver(){
        return new MyLocaleResolver();
    }

    //注册拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //记得把静态资源排除拦截
        registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
                .excludePathPatterns("/index.html","/","/user/login",
                        "/**/*.css", "/**/*.js", "/**/*.png", "/**/*.jpg",
                        "/**/*.jpeg", "/**/*.gif", "/**/fonts/*", "/**/*.svg");
    }
}
addPathPatterns:添加拦截的路径    /** 表示都拦截
excludePathPatterns:排除需要拦截的请求,比如访问的首页、登陆按钮的路径、静态资源.......(根据开发情况)

这是直接不登录访问网页则出现提示

猜你喜欢

转载自www.cnblogs.com/lyh233/p/12520821.html