栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Vert.x:一个简单的登录访问demo(router的简单使用)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Vert.x:一个简单的登录访问demo(router的简单使用)

当前版本:jdk1.8、vert.x 4.2.4

1. 声明

当前内容主要为记录和学习使用Vert.x实现一个简单的登录访问控制操作的demo,当前内容参考:官方文档,这是一个非常简单的有意思的项目

主要功能:

    实现非常简单登录功能实现非常简单登出功能实现访问控制(登录后方才可以访问)实现基于Vert.x的session登录控制功能 (参考官方文档)

pom依赖


	UTF-8
	4.2.4


	
		
			io.vertx
			vertx-stack-depchain
			${vertx.version}
			pom
			import
		
	



	
		io.vertx
		vertx-web
	

2. 自定义登录控制的demo

1. 主要程序编写

import io.vertx.core.AbstractVerticle;
import io.vertx.core.MultiMap;
import io.vertx.core.Promise;
import io.vertx.core.http.HttpMethod;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.auth.User;
import io.vertx.ext.web.Router;

public class MainVerticle extends AbstractVerticle {
	boolean login = false;
	@Override
	public void start(Promise startPromise) throws Exception {
	
		 // Create a Router
	    Router router = Router.router(vertx);
	    
	    // 登录操作
		
	    router.route("/login").handler(context->{
	    	MultiMap queryParams = context.queryParams();
			String username = queryParams.get("username");
			String password = queryParams.get("password");
	    	User user = User.create(new JsonObject().put("username", username).put("password", password));
	    	context.setUser(user);
	    	login=true;
	    	context.json( new JsonObject().put("status", 200).put("msg", "login success!"));
	    });
	    
	    // 所有的都需要登录验证才允许操作(认证操作)
	    router.route().handler(context->{
			User user = context.user();
			System.out.println(user);
	    	if(!login){
	    		System.out.println("认证用户失败!");
	    		context.json( new JsonObject().put("status", 500).put("msg", "no login"));
	    	}else {
	    		// 直接放行执行下一个router
	    		context.next();
	    	}
	    	
	    });
	    
	    router.route("/logout").handler(context->{
	    	login=false;
	    	context.json( new JsonObject().put("status", 200).put("msg", "login out success!"));
	    });
	   
	   

	    // 执行请求操作
	    router.route("/hello").method(HttpMethod.GET).handler(context->{
	    	//context.json( new JsonObject().put("status", 200).put("msg", "ok"));
	    	context.json(new JsonObject("{"status":200,"msg":"ok"}"));
	    });
	    
	 // Create the HTTP server
	    vertx.createHttpServer()
	      .requestHandler(router)
	      .listen(8888)
	      .onSuccess(server ->
	        System.out.println(
	          "HTTP server started on port " + server.actualPort()
	        )
	      );

	}
}

其中最主要的为context.next();,表示放行的意思就是让下一个匹配的继续执行,注意login的router必须在全匹配登录验证的前面,否则login也会被拦截的,这里设置无需密码就可登录,注意拦截router的顺序问题

2.部署程序

public class Application {
	public static void main(String[] args) {
		Vertx vertx = Vertx.vertx();
		// 直接部署一个vertx程序
		vertx.deployVerticle(new MainVerticle());

	}
}

3. 测试自定义登录demo

1.启动服务程序

直接访问受保护的,发现为500

进行登录操作

再次访问/hello

进行登出操作

再次访问/hello,再次被拦截

测试成功!

4. 基于Vert.x的Session机制的登录控制demo

该功能主要依赖Session实现,与前面的手动控制要好些

@Override
public void start(Promise startPromise) throws Exception {

	 // Create a Router
    Router router = Router.router(vertx);
    //bindLoginAndLogoutRouter(router);
	 router.route().handler(SessionHandler.create(LocalSessionStore.create(vertx)));
	 AuthenticationProvider authenticationProvider = new AuthenticationProvider() {
			
			@Override
			public void authenticate(JsonObject credentials, Handler> resultHandler) {
				//String username = credentials.getString("username");
				//String password = credentials.getString("password");
				//System.out.println("username:"+username+",password="+password);
				// 一个空的实现
			}
		};
	// 处理登录界面,使用表单登录方式
	//router.post("/login").handler(FormLoginHandler.create(authenticationProvider));

	// Set a static server to serve static resources, e.g. the login page
	// 开放登录静态页面
	//router.route().handler(StaticHandler.create());
	// 开始绑定登录路由
	
    router.route("/login").handler(context->{
    	MultiMap queryParams = context.queryParams();
		String username = queryParams.get("username");
		String password = queryParams.get("password");
    	
		// 用户名密码为admin的才允许登录
    	if(username!=null&&password!=null&&"admin".equals(username.trim())&&"admin".equals(password.trim())) {
    		User user = User.create(new JsonObject().put("username", username).put("password", password));
	    	context.setUser(user);
	    	context.json( new JsonObject().put("status", 200).put("msg", "login success!"));
    	}else {
    		context.json( new JsonObject().put("status", 500).put("msg", "login failed!"));
    	}
    	
    	
    });
    router.route("/loginpage").handler(context->{
    	context.json( new JsonObject().put("status", 200).put("msg", "please login!"));
    });

    // 绑定认证路由
    // 所有的都需要登录验证才允许操作(认证操作)
   
	RedirectAuthHandler authHandler = RedirectAuthHandler.create(authenticationProvider);
    router.route().handler(authHandler);
    
    // 绑定登出路由
    router.route("/logout").handler(context->{
    	// 清空已经登录的用户操作
    	context.clearUser();
    	context.json( new JsonObject().put("status", 200).put("msg", "login out success!"));
    });

    // 执行请求操作
    router.route("/hello").method(HttpMethod.GET).handler(context->{
    	context.json(new JsonObject("{"status":200,"msg":"ok"}"));
    });
    
 // Create the HTTP server
    vertx.createHttpServer()
      // Handle every request using the router
      .requestHandler(router)
      // Start listening
      .listen(8888)
      // Print the port
      .onSuccess(server ->
        System.out.println(
          "HTTP server started on port " + server.actualPort()
        )
      );

}

1.router.route().handler(SessionHandler.create(LocalSessionStore.create(vertx)));表示开启session控制存储机制

只有开启Session并且打开认证提供,那么此时创建的User就是会在登录成功后保存在服务器中的

2. context.setUser(user);表示设置认证的对象到服务器基于session方式

3. context.clearUser();表示删除服务器中的session对应的user

4. /loginpage表示默认需要登录的位置,即登录失败后重定向的位置

测试访问/hello,直接被重定向到/loginpage地址了

错误的登录

正确的登录

登录后可以随意访问


退出登录


调试后发现这个:通过cookie进行控制的

测试成功!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/735656.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号