自定义miniTomcat功能(3)

本文介绍了一种动态处理器,用于解析请求URL并根据指定的类名创建实例进行处理,如SpringMVC的注解方式。同时,静态处理器负责返回静态文件数据。在登录处理中,动态处理器生成sessionId,将其写入cookie,并在服务器端保存用户信息。整个流程涉及到了HTTPServlet、Session和Cookie的管理。
摘要由CSDN通过智能技术生成

静态请求处理和动态请求处理

动态请求,以包含xx.action的,解析请求,创建实例

package com.hole.server;

import com.hole.controller.ErrorHandler;
import com.hole.http.HttpServletRequest;
import com.hole.http.HttpServletResponse;
import com.hole.servlet.HttpServlet;
import com.hole.servlet.ServerInterface;
import com.hole.servlet.ServletContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * @describtion: 动态处理类,处理请求参数中指定处理类,springmvc是采用注解@requestmapping的方式找到处理类(ioc方式和自定义请求分转类)。也可以注册httpServlet处理请求
 * @author: guozi
 * @create: 2021-01-30
 */
public class DynamicProcessor implements Processor{
    public static final Logger logger = LoggerFactory.getLogger(DynamicProcessor.class);
    @Override
    public void process(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse){
        //假设请求为/hello.action
        String className = httpServletRequest.getRequestUrl().substring(1, httpServletRequest.getRequestUrl().indexOf("."));
        //className转化为类名的格式
        String transClassName =  className.toLowerCase().substring(0,1).toUpperCase() + className.toLowerCase().substring(1,className.length());
        HttpServlet servlet = null;
        //单例模式,防止多次创建servlet
        if(ServletContext.servlets.get(transClassName) == null){
            synchronized(DynamicProcessor.class){
                try{
                    if(ServletContext.servlets.get(transClassName) == null){
                        //默认加载controller包下的类来处理对应请求
                        Class handleClass = Class.forName("com.hole.controller."+transClassName + "Handler");
                        Object obj = handleClass.newInstance();
                       ServletContext.servlets.put(transClassName, obj);
                       if(obj instanceof HttpServlet){
                           servlet = (HttpServlet)obj;
                           servlet.init();
                       }
                    }
                }catch (Exception e){
                    logger.error("初始化动态servlet失败,原因:{}", e.getMessage());
                }
            }
        }else {
            servlet = (HttpServlet)ServletContext.servlets.get(transClassName);
        }
        try{
            if(servlet != null) {
                servlet.service(httpServletRequest, httpServletResponse);
            }
        }catch (Exception e){
            logger.error("servlet处理失败,原因:{}", e.getMessage());
        }
    }
}
package com.hole.server;

import com.hole.http.HttpServletRequest;
import com.hole.http.HttpServletResponse;


/**
 * @describtion: 静态处理类,主要返回静态文件数据
 * @author: guozi
 * @create: 2021-01-30
 */
public class StaticProcessor implements Processor{

    @Override
    public void process(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
        httpServletResponse.sendRedirect();
    }
}

Seesion和cookie的生成

login.action是生成sessionId,并写入cookie中,最后在将用户信息保存在服务端session中

package com.hole.controller;

import com.hole.http.HttpServletRequest;
import com.hole.http.HttpServletResponse;
import com.hole.http.HttpSession;
import com.hole.servlet.HttpServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

/**
 * @description: 动态请求的登录处理类
 * @author: guozi
 * @create: 2021-03-01
 */
public class LoginHandler extends HttpServlet {
    public static final Logger logger = LoggerFactory.getLogger(LoginHandler.class);
    @Override
    protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
        String userName = httpServletRequest.getParameters("username");
        String password = httpServletRequest.getParameters("password");
        if(userName == null || password == null || userName.length() == 0 || password.length() == 0){
            ErrorHandler errorHandler = new ErrorHandler();
            httpServletRequest.setParameters("errorMessage", "参数不对");
            httpServletRequest.setParameters("code", "400");
            logger.error("参数不对password:{};userName:{}出错", password, userName);
            errorHandler.doPost(httpServletRequest, httpServletResponse);
            return;
        }

        logger.info(userName+"\t"+password);
        //模拟登录,返回唯一的session,存在服务端缓存中, 并将sessionId写入到cookie中
        HttpSession httpSession = httpServletRequest.getHttpSession();
        httpSession.setAttribute("username", userName);
        if(password.length() != 0){
            try{
                httpSession.setAttribute("password", Base64.getEncoder().encodeToString(password.getBytes(StandardCharsets.UTF_8)) );
            }catch (Exception e){
                ErrorHandler errorHandler = new ErrorHandler();
                httpServletRequest.setParameters("errorMessage", "解析加密密码出错");
                httpServletRequest.setParameters("code", "400");
                logger.error("解析加密password:{}出错", password);
                errorHandler.doPost(httpServletRequest, httpServletResponse);
                return;
            }
        }
        PrintWriter printWriter = httpServletResponse.getWriter();
        String sessionId = httpServletRequest.getSessionID();

        //写入cookie print()方法,快速写入行数据
        if(sessionId!=null) {
            printWriter.print("HTTP/1.1 200 OK\r\nSet-Cookie: JSESSIONID="+sessionId+"\r\n\r\n");
        } else {
            printWriter.print("HTTP/1.1 200 OK\r\n\r\n");
        }
        //输入html内容
        printWriter.print("<html>");
        printWriter.print("<body>");
        printWriter.print("login success!   \r\n");
        printWriter.print("sessionId:" + sessionId);
        printWriter.print("</body>");
        printWriter.print("</html>");
        printWriter.flush();
        printWriter.close();
    }

    @Override
    protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
        httpServletResponse.sendRedirect();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值