Dubbo、Zookeeper集群搭建及Rose使用心得(二)

上篇讲了一下配置,这次主要写一下这个框架开发的大概流程。这里以实现 登陆 功能为例。

一、准备工作

  1.访问拦截器  

  用户在进行网站访问的时候,有可能访问到不存在的网页,所以,我们需要把这些链接重新定向到一些存在的网页。比如,我们的页面只有登录页面,但是用户访问了注册页面,这个时候就是不存在的,我们可以把 用户的访问 定向到  自己配置的404页面。具体配置如下(web.xml):

<error-page>
    <error-code>404</error-code>
    <location>/views/404.jsp</location>
</error-page>

  还有一种情况就是 用户访问一些 需要满足某种条件才能访问的页面时,也要对其进行拦截,比如,后台管理中心,要求用户登录才能访问。这个时候就要在java代码中对其进行判断。有两种方式。

  a)通过继承Filter类。这个要现在web.xml中配置,配置代码如下:

<filter>
    <filter-name>exceptionFilter</filter-name>
    <filter-class>com.lhh.myweb.web.controllers.ExceptionFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>exceptionFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

    java代码如下:

package com.lhh.myweb.web.controllers;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ExceptionFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest hsr = (HttpServletRequest) request;
        HttpServletResponse hsrp = (HttpServletResponse) response;
        String uri = hsr.getRequestURI();
        if (!uri.contains("login") && !uri.contains("js") && !uri.contains("css") && !uri.contains("images")
                && !uri.contains("views")) {
            String xrequest = hsr.getHeader("x-requested-with");
            if (xrequest == null) {
                hsrp.sendRedirect(hsr.getContextPath() + "/login");
            } else {
                hsrp.setHeader("r_error_type", "noprivilege");
                hsrp.setHeader("r_exception_msg", "用户没有登录");
                hsrp.setHeader("r_exception_id", "1");
            }
        } else {
            chain.doFilter(request, response);
        }

    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
    }

}

    从代码中可以看到,这个是对所有的访问进行拦截。和下面要写的方法不同。

    b)继承ControllerInterceptorAdapter类。这个有一个需要注意的地方就是,这段代码要放在controllers文件夹下(Rose框架约定)。代码如下:

package com.lhh.myweb.web.controllers;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.lhh.myweb.common.admin.UserBean;

import net.paoding.rose.web.ControllerInterceptorAdapter;
import net.paoding.rose.web.Invocation;

public class AccessTrackInterceptor extends ControllerInterceptorAdapter {

    @Override
    protected Object before(Invocation inv) throws Exception {
        HttpServletRequest request = inv.getRequest();
        HttpServletResponse response = inv.getResponse();
        HttpSession session = request.getSession();
        UserBean ub = (UserBean) session.getAttribute("user");
        String uri = request.getRequestURI();
        if (ub == null && !uri.contains("login")) {
            String xrequest = request.getHeader("x-requested-with");
            if (xrequest == null) {
                response.sendRedirect(request.getContextPath() + "/login");
            } else {
                response.setHeader("r_error_type", "noprivilege");
                response.setHeader("r_exception_msg", "用户没有登录");
                response.setHeader("r_exception_id", "1");
            }
            return false;
        } else {
            return true;
        }
    }
}

    PS:b和a的区别在于,b在a执行之后才执行,a是对所有的访问链接拦截,b是对注册过的链接拦截。对一个没有注册过的链接访问,比如,http://域名/abc ,这个时候就只有a方法起作用,b方法不起作用。那么何为注册的链接,就是在controllers定义过的。比如如下代码:

package com.lhh.myweb.web.controllers;

import net.paoding.rose.web.annotation.Path;
import net.paoding.rose.web.annotation.rest.Get;

@Path("")
public class LoginController {

    @Get("login")
    public String login(){
        return "login";
    }
}

    这里的login就是注册过的链接,如果把login换成abc,那么上面的访问,会先进入a方法再进入b方法。controller的具体用法以后会写到。这里暂且不细说。

  2.上述java代码中可以看到,每个文件夹都有明确的分工。下面就写一下Rose对于文件以及文件夹名称的约定。

    a)控制层。在WEB层中,会对请求进行映射。比如,当用户访问login时,我们返回login的页面。这个是怎么做的呢?首先要创建一个文件夹,名称必须为controllers,如果我们对登陆进行控制,就要在这个文件夹下,新建一个java文件,必须以Controller结尾(注意大小写)。比如,LoginController.java。结构如下(代码在方法b中):

    

    解释几个关键字:

     [Get注解是rose框架提供的标识一个http访问是get还是post或者是其他,并且会将path与get中的字符串连接成一个url]   

     下述代码可以从浏览器访问:http://localhost/hello/world [注意path与get中的参数]。

package com.chen.controllers;
import net.paoding.rose.web.annotation.Path;
import net.paoding.rose.web.annotation.rest.Get;
@Path("/hello/")
public class HelloController {
  @Get("world")
  public String index() {
    return "@hello world";
  }
}

    返回值也有约定:

      返回普通字符串,如上所述,最常用的做法,返回一个页面。
      以“@”开头的字符串,比如“return "@HelloWorld";”,会将“@”后面的字符串“HelloWorld”作为结果返回;

    b)DAO层。在center层中,对数据库进行访问。这个也对文件命名有约定有,要以DAO结尾。示例代码如下:

package com.yeepay.tctj.center.dao.areautil;

import java.util.Map;

import net.paoding.rose.jade.annotation.DAO;
import net.paoding.rose.jade.annotation.SQL;

@DAO
public interface AreaUtilDAO {

    @SQL("select area_id ,area_name from area where area_level = 2")
    public Map<String,String> getAreaCityUtil();

    @SQL("select area_id,area_name from area where area_level = 1")
    public Map<String,String> getAreaProvince();

}

    具体使用方法以后会提到。这里不多说。

二、开发流程

  我们要实现的功能是登陆,也就是说用户会输入 用户名 和 密码。

  1.web层代码(LoginController)

package com.lhh.myweb.web.controllers;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.paoding.rose.web.annotation.Path;
import net.paoding.rose.web.annotation.rest.Get;
import net.paoding.rose.web.annotation.rest.Post;

@Path("")
public class LoginController {

    @Get("login")
    public String login(){
        return "login";
    }

    @Post("login_check")
    public void login_check(HttpServletRequest request,HttpServletResponse response){
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("username:"+username);
        System.out.println("password:"+password);
    }
}

  这段代码的意思是,当用户访问 "login"时,会把login的页面返回过去。当访问,login_check时,会把用户名和密码打印出来。这里需要注意的是,要把"login_check"添加到拦截器中。

  效果如下:

  

  

  2.我们获取到网页传来的值之后开始检查数据库。首先我们在common层定义一个接口。代码如下:

package com.lhh.myweb.common.login;

public interface LoginInterf {

    public String login_check(String username,String password);
}

  3.它的实现类在center中。代码如下(LoginImpl):  

package com.lhh.myweb.center.login;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.lhh.myweb.center.dao.LoginDAO;
import com.lhh.myweb.common.admin.UserBean;
import com.lhh.myweb.common.login.LoginInterf;

@Service(value="login")
public class LoginImpl implements LoginInterf{

    @Autowired
    private LoginDAO dao;
    @Override
    public UserBean login_check(String username, String password) {
        // TODO Auto-generated method stub
        UserBean userBean = dao.login_check(username, password);
        return userBean;
    }
}

   注意@Service(value="login")

   LoginDAO代码如下:

package com.lhh.myweb.center.dao;

import com.lhh.myweb.common.admin.UserBean;

import net.paoding.rose.jade.annotation.DAO;
import net.paoding.rose.jade.annotation.SQL;
import net.paoding.rose.jade.annotation.SQLParam;

@DAO
public interface LoginDAO {

    @SQL("select name as username,pass as password from user where name = :username and pass = :password")
    public UserBean login_check(@SQLParam("username") String username,@SQLParam("password") String password);
}    

  需要注意的是,LoginInterf是一个服务,要在dubbo-provider.xml注册,代码如下

 <dubbo:service interface="com.lhh.myweb.common.login.LoginInterf" ref="login"/>

  4.在web层再写一个类用于调用这个服务,代码如下(LoginSvc):

package com.lhh.myweb.web.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.lhh.myweb.common.admin.UserBean;
import com.lhh.myweb.common.login.LoginInterf;

@Service
public class LoginSvc {

    @Autowired
    private LoginInterf li;
    public UserBean login_check(String username,String password){
        UserBean ub = li.login_check(username, password);
        return ub;
    };
}

  注意@Service,引入的包是org.springframework.stereotype.Service;

  要在消费者调用 LoginInterf,代码如下:

<dubbo:reference id="login" interface="com.lhh.myweb.common.login.LoginInterf" />

  5.在LoginController中调用LoginSvc.代码如下:

package com.lhh.myweb.web.controllers;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;

import com.lhh.myweb.common.admin.UserBean;
import com.lhh.myweb.web.service.LoginSvc;

import net.paoding.rose.web.annotation.Path;
import net.paoding.rose.web.annotation.rest.Get;
import net.paoding.rose.web.annotation.rest.Post;

@Path("")
public class LoginController {

    @Autowired
    private LoginSvc svc;
    @Get("login")
    public String login(){
        return "login";
    }

    @Post("login_check")
    public void login_check(HttpServletRequest request,HttpServletResponse response){
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        System.out.println("username:"+username);
        System.out.println("password:"+password);

        UserBean ub = svc.login_check(username, password);

        System.out.println("ubname:"+ub.getUsername());
        System.out.println("ubpass:"+ub.getPassword());
    }
}

结果如下

大致流程就是这样。

时间: 2024-11-08 21:12:18

Dubbo、Zookeeper集群搭建及Rose使用心得(二)的相关文章

kafka学习(二)-zookeeper集群搭建

zookeeper概念 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名 服务等.Zookeeper是hadoop的一个子项目,其发展历程无需赘述.在分布式应用中,由于工程师不能很好地使用锁机制,以及基于消息的协调机制 不适合在某些应用中使用,因此需要有一种可靠的.可扩展的.分布式的.可配置的协调机制来统一系统的状态.Zookeeper的目的就在于此. 1.角色 Zookeeper中的角色主要有以下三

Linux下ZooKeeper集群搭建

首先安装VMWare,装了两个虚拟机,版本是CentOS6.5,IP分别是 192.168.3.20 192.168.3.21 然后下载ZooKeeper包:http://zookeeper.apache.org/,使用命令tar -zxvf  zookeeper.tar.gz 进行解压,解压到/opt/soft目录 修改主机名 vim  /etc/hosts ,在hosts文件中添加一下两项 192.168.1.20 master 192.168.1.21 slave1 进入zookeeper

【zookeeper】 zookeeper 集群搭建

集群搭建环境: 发行版:CentOS-6.6 64bit 内核:2.6.32-504.el6.x86_64 CPU:intel-i7 3.6G 内存:2G 集群搭建步骤: 1. 确保机器安装了jdk [[email protected] ~]# java -version openjdk version "1.8.0_51" OpenJDK Runtime Environment (build 1.8.0_51-b16) OpenJDK 64-Bit Server VM (build

2. zookeeper集群搭建

zookeeper集群搭建 1.zookeeper集群组件: Zookeeper集群中的服务器角色有三种, leader(主)  server, follower(从)  server, observer(从)  server: 2.leader特殊之处在于它有决定权,具有Request Processor (observer server 与follower server的区别就在于不参与leader选举) 3.配置文件: 3.1将zoo_sample.cfg修改为zoo.cfg配置文件(好记

CentOS下的ZooKeeper集群搭建

ZooKeeper集群搭建过程: 1.下载ZooKeeper安装包,解压安装: 2.在/etc/profile下配置ZooKeeper环境变量,增加变量$ZOOKEEP_HOME=ZooKeeper安装目录,再将$ZOOKEEPER_HOME/bin添加到$PATH变量: 3.将ZooKeeper安装目录conf下zoo_sample.cfg另存为zoo.cfg, 并修改相关配置信息: 4.将zoo.cfg文件拷贝到集群下的其他服务器上: 5.在每一台ZooKeeperZooKeeper服务器的

Zookeeper 集群搭建

下载并上传 zookeeper-3.5.3-beta.tar.gz 到各个服务器的/soft/zookeeper目录,或者使用wget命令,如下: cd /soft/zookeeper wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.5.3-beta/zookeeper-3.5.3-beta.tar.gz tar -xvf zookeeper-3.5.3-beta.tar.gz 在各个服务器上解压zoo

分布式架构中一致性解决方案——Zookeeper集群搭建

当我们的项目在不知不觉中做大了之后,各种问题就出来了,真jb头疼,比如性能,业务系统的并行计算的一致性协调问题,比如分布式架构的事务问题, 我们需要多台机器共同commit事务,经典的案例当然是银行转账,支付宝转账这种,如果是一台机器的话,这个还是很方便的,windows中自带了一个事务协 调器mstsc,但是呢,你那种很大很牛逼的项目不可能全是windows服务器,对吧,有些人为了解决这个问题,会采用2pc,3pc这种算法,或者是paxos的思 想进行分布式下的一致性处理,当然在这个世界上,真

ZooKeeper集群搭建中的Connection refused而导致的启动失败

1. 前言 每一次搭建集群环境都像一次战斗,作战中任何一个细节的出错都会导致严重的后果,所以搭建中所需要做的配置如系统配置.网络配置(防火墙记得关).用户权限.文件权限还有配置文件等等内容,都必须非常仔细,将失误扼杀在摇篮之中,避免因为粗心或者想要提高速度省下的一分钟,在后面付出几个小时的调试时间,因小失大实在不值,切记核对.核对再核对. 今天就来说说在搭建ZooKeeper集群遇到的一个常见的问题Connection refused,也就是网上很多朋友也会出现的问题,问题的表现也许是一样,但是

solr+zookeeper集群搭建

一.前期准备工作 相关工具: 1.虚拟机(VMware) 2.tomcat7 64位  下载地址:http://tomcat.apache.org/download-70.cgi 3.centos6.4  64位 4.linux下的64位jdk安装包,版本为6或以上 5. solr-4.3.1.tgz包  下载:http://archive.apache.org/dist/lucene/solr/ 6. zookeeper-3.4.5.tar.gz包  下载:http://hadoop.apac