静态请求处理和动态请求处理
动态请求,以包含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();
}
}