WEB应用的后台门户都有登录入口。做过几次登录的功能。就第一次会感觉难。难再功能菜单的级联查询组装,网上查一查。自己debug试试,最后搞定了.然后就把代码小心保存,以后就copy copy copy。哈哈!今天对springboot开发web应用做一些总结,只说说web登录这一块,以后慢慢记录一下sprinboot+springcloud的内容,从去年10月到现在。小半年时间基本也算对springboot+springcloud的微服务有一些应用上的体会。
一:登录用到的几个接口和方法:
HandlerInterceptor这个接口是代理拦截器。作用就是拒绝非法访问,
如果一个用户没有通过登录验证就拒绝访问系统,将其跳转到登录页面。所以一般定义一个拦截器实现这个接口:
@Slf4j public class LoginHandlerInterceptor implements HandlerInterceptor { @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Object obj = request.getSession().getAttribute("user"); if(obj == null){ response.sendRedirect("/toLogin"); return false; } return true; } }
判断当前用户是否session为空。
二:
WebMvcConfigurerAdapter这是个web配置类。我们集成此类实现自己的方法逻辑,有几个常用的方法:
(1):
addViewControllers方法:这个方法是添加页面过滤跳转的,一般情况,你要通过controller调用一个方法,没有任何逻辑跳转到,
你的另一个初始化页面,再controller里面要写至少三行代码,这里只要一行:加粗斜着的一行,可以无限添加
public void addViewControllers(ViewControllerRegistry viewControllerRegistry) { viewControllerRegistry.addViewController("/").setViewName("/login"); viewControllerRegistry.setOrder(Ordered.HIGHEST_PRECEDENCE); super.addViewControllers(viewControllerRegistry); }
(2):
addInterceptors方法:这个方法是针对某些方法,特殊处理,跳过拦截器可以直接访问。如果登录、登出、去登录外部接口调用等
如果不加这个方法,外部请求会被上面的拦截器统一拦截返回302,也就是被拦截。代码如下:
@Override public void addInterceptors(InterceptorRegistry interceptorRegistry) { interceptorRegistry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**") .excludePathPatterns(ManageContent.TO_LOGIN_URL,ManageContent.LOGIN_URL,ManageContent.LOGIN_OUT); super.addInterceptors(interceptorRegistry); }
(3):
addResourceHandlersfangfa :这个方法是处理静态资源的。一般情况不用重写该方法。
但是如果你对额资源文件没有放在默认的路径下面:classpatgh:resources下面的话,sprinboot是找不到你的资源文件的。
这个时候你需要自己重写改方法:
public void addResourceHandlers(ResourceHandlerRegistry registry) { //需要告知系统,这是要被当成静态文件的! //第一个方法设置访问路径前缀,第二个方法设置资源路径 registry.addResourceHandler("/**").addResourceLocations("classpath:/mydefine/"); super.addResourceHandlers(registry); } @EnableWebMvc注解会使springboot原有的配置失效。
如果有用到前端的模板引擎的话,需要初始化模板引擎的一些参数,一般有freemarker,themleaf等。、
@Slf4j public class FreeMarkerViewInterceptor extends FreeMarkerView { @Override protected void exposeHelpers(Mapmodel, HttpServletRequest request) throws Exception { String scheme = request.getScheme(); String serverName = request.getServerName(); int port = request.getServerPort(); String path = request.getContextPath(); // String fullbase = scheme + "://" + serverName + ":" + port + path; // model.put("fullbase", fullbase); model.put("base", request.getContextPath()); super.exposeHelpers(model, request); } }
@Bean public FreeMarkerViewResolver freeMarkerViewResolver() { FreeMarkerViewResolver resolver = new FreeMarkerViewResolver(); resolver.setSuffix(".ftl"); resolver.setContentType("text/html; charset=UTF-8"); resolver.setExposeRequestAttributes(false); resolver.setExposeSessionAttributes(false); resolver.setExposeSpringMacroHelpers(true); resolver.setOrder(0); resolver.setRequestContextAttribute("request"); resolver.setViewClass(FreeMarkerViewInterceptor.class); resolver.setCache(false); log.info("初始化 freeMarkerViewResolver "); return resolver; }
、、这些参数应该也可以配置在yml文件里面,但是我没有试过
差不多就这些,可能还会有其他一些登录的特殊处理逻辑,目前没有用到。