您的位置:首页 > 编程语言 > Java开发

springboot之配置springmvc(登录拦截和设置默认首页)

2019-05-23 16:29 471 查看
前言

打算给项目加点小功能:

  • 添加默认首页,当我们输入端口号+项目名后就能进入登陆页面
  • 登录拦截,如果未登录我们就跳转到登录页面,已登录可以访问其他页面

为了实现这两个功能,我们需要用java类的方式来进行配置

项目环境:springboot 版本1.5.9 , 2.x的版本可以进行参考(静态资源的访问不一样,配置项目名不一样).

项目名:本项目里我们配置了项目名,在配置文件中加入server.context-path=/test(2.x版本有不同)

1.项目跳转

在项目开发过程中,经常会涉及页面跳转问题,而且这个页面跳转没有任何业务逻辑过程,只是单纯的路由过程 ( 点击一个按钮跳转到一个页面 ) 。

这时有两种方法

1.在controller里设置requestMapping

2.使用springmvc的addviewcontrollers方法,具体如下:继承WebMvcConfigurerAdapter后重写**addViewControllers()**方法

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController( "/" ).setViewName( "/login" );
// "/login" 在controller里有映射,跳转login页面
//该句等同于@RequestMapping("/")  return "login"
}
}

之后我们输入端口号+项目名就能直接跳转到登录页面

2.登录拦截

有时候我们需要实现这样一个需求:登录拦截

如果用户没有登录,去任何一个网页都会跳转到登录页面,如果用户已经登录,那么用户可以访问其他页面.

首先我们定义一个拦截类,获取session(即我们登录后要在session里加一个user字段,以便我们验证)

public class MyInterceptor implements HandlerInterceptor {
private static Logger logger = LoggerFactory.getLogger(MyInterceptor.class);

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//获取session
HttpSession session = request.getSession(true);
//判断用户ID是否存在,不存在就跳转到登录界面
if(session.getAttribute("user") == null){
logger.info((String)session.getAttribute("userName"));
logger.info("------:跳转到login页面!");
response.sendRedirect(request.getContextPath()+"/login");
return false;
}else{
return true;
}
}

@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}

@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception
}
}

之后我们继承WebMvcConfigurerAdapter后重写**addInterceptors()**方法

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/login","/loginToken");
}
//我们拦截其他请求,但是排除了"/login"和"loginToken"的请求,这两个可以通过
}
3.@EnableWebMvc

加入此注解,很可能会使你的静态资源无法加载,而且很可能你并不需要加入此注解,在官方文档中也提到这一点

  • If you want to keep Spring Boot MVC features, and you just want to add additional MVC configuration (interceptors, formatters, view controllers etc.) you can add your own @Configuration class of type WebMvcConfigurerAdapter, but without @EnableWebMvc. If you wish to provide custom instances of RequestMappingHandlerMapping, RequestMappingHandlerAdapter or ExceptionHandlerExceptionResolver you can declare a WebMvcRegistrationsAdapter instance providing such components.

如果你想探究原因,你可以去读下面的博客

深入Spring Boot:显式配置 @EnableWebMvc 导致静态资源访问失败(强烈推荐)

4.静态资源的导入

如果你依然想使用@EnablewebMvc的注解,或者你有一些其他的静态资源方面的需求,你可以尝试下面的方法

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
}
//前面的参数为我们请求的路径,后面的参数为资源的路径
//springboot2.x版本有一定的差别
}
5.整合

webConfig类

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController( "/" ).setViewName( "/login" );
}

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");

}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/login","/loginToken");
}

}

MyInterceptor类

public class MyInterceptor implements HandlerInterceptor {
private static Logger logger = LoggerFactory.getLogger(MyInterceptor.class);

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//获取session
HttpSession session = request.getSession(true);
//判断用户ID是否存在,不存在就跳转到登录界面
if(session.getAttribute("user") == null){
logger.info((String)session.getAttribute("userName"));
logger.info("------:跳转到login页面!");
response.sendRedirect(request.getContextPath()+"/login");
return false;
}else{
return true;
}
}

@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}

@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception
}
}
6.总结
  • @EnableWebMvc的注解没有必要,可以不加
  • 添加静态资源路径时通过调试出现bug日志显示为:
No mapping found for HTTP request with URI [/项目名/js/captcha/captcha.min.js] in DispatcherServlet with name 'dispatcherServlet'

而我输入在地址栏localhost:8080/项目名/static/js/captcha/captcha.min.js可以访问到js文件

因此我们需要调整静态资源的映射路径和资源路径来实现加载静态资源的目的

当时的解决方案有:

  1. 映射路径: " /static/**" 资源路径 : "/static/ " 初期从网上找的解决方案根本不理解其意思,结果失败(可能适合springboot2.x,因为springboot1.5.9加资源名可直接访问静态资源,springboot2.x需要前面加文件夹名static)

  2. 映射路径: “/项目名/**” 资源路径: “/项目名/static/” 此时有了一定的想法,但最终还是失败

  3. 映射路径: “/**” 资源路径:"/static/" 成功

事实上后两个各自成功和失败的原因自己只是有一些模糊的认识,具体的原因还需要后面继续的学习

7.补充

在后续一次实验中,发现在使用@EnableWEBMVC的情况下从后台向前台传json数据的时候发现了中文乱码的情况,当去掉这个注解和自己配置的静态资源后不再出现乱码.

事实上,如果不加此注解,是springboot帮助我们配置.当加入此注解后,很多东西需要我们自己配置,而且很可能出现不必要的错误,如果需求不多,大家可以选择不加注解的方法

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: