Online Judge(OJ)搭建(第一版)
搭建 OJ 需要的知识(重要性排序):
Java SE(Basic Knowledge, String, FileWriter, JavaCompiler, URLClassLoader, SecurityManager, synchronized)
Java Virutal Machine(Classpath,Policy)
Servlet(HttpServlet)
JSP(Session, JSP, EL, JSTL, Custom Tags)
Tomcat(Classpath)
Java EE(JavaBean)
设计模式(MVC模式, Wrapper模式(我自己起的名字,即覆盖某一类改变特定的功能,其余功能不变))
HTML(HTTP)
OJ流程以及实现:
①在网页获取相关代码(HttpServlet从HTML中获取文本内容)
②保存(FileWriter)
③编译(JavaCompiler)
④执行(SecurityManager + Java Policy + ProcessBuilder 或者 Tomcat Policy + URLClassLoader)
流程图,http://blog.csdn.net/niluchen/article/details/8711586(我参考了一下,我的流程和他类似,但是实现很大程度上不同)。
OJ细节(对应流程步骤):
①在网页获取相关代码
A. 不用 JSP 写网页代码,这样很丑,而且不利于维护。 网页上要使用 JSP,使用 EL 和 JSTL,实在不行还有 Custom Tag。
B. 利用 urlPatterns 转入相应功能处理。
②保存
A. 用 JavaBean 存储相关代码信息。
B. 利用 FileWriter 写文件。
C. 利用 File 检查相关路径。
D. 文件处理经常发生异常,做好相关的处理机制。
E. 利用一个类来处理保存,编译,执行代码。
③ 编译
A. JavaCompiler 相关代码请 Google。
B. JavaComplier 可以收集编译错误,一旦有编译错误,就不用执行,转入错误页面。
④执行
X. 这一步为 OJ 的核心部分,OJ 需要很强的安全性。Java 的沙盒机制一定程度上保证了程序的安全性,然而 Tomcat 也有自己的、基于 Java 的安全机制。
A. 务必熟悉 JVM 相关安全机制:Java Policy, Java SecurityManager。
B. 务必熟悉 Tomcat Policy 配置。
分支1(SecurityManager + Java Policy + ProcessBuilder)
强烈不建议。Tomcat 涉及之初就有考虑到安全性问题,所以自定义了 Policy。并且 Tomcat 不使用当前系统的 Classpath,给 ProcessBuilder 构建 Java 程序的时候造成了极其大的麻烦;但如果你更改了 Classpath, 给 Tomcat 带来了极其大的安全隐患。
本人就由于 Tomcat 不使用当前系统的 Classpath 这一机制产生的问题困扰了两天。在普通环境下,ProcessBuilder 执行 Java 文件没有任何错误,然而在 Tomcat 环境下,ProcessBuilder 一直提示找不到或者无法加载类。后来我在 Eclipse 下启动 Tomcat(原先是在 cmd 下启动)发现可以编译。在 Google 搜索中发现了可能是 Classpath 的问题,于是我输出了不同环境下的 Classpath 进行对比,发现在 cmd 下 Tomcat 的 Classpath 只包括自身的 jar,并不包括 Java 编译时需要的 jar。后来我在 ProcessBuilder 中加入了 -cp 选项,发现还是不能运行,究其原因是 Tomcat 运行之后,禁止设置Classpath!后来又在配置文件中修改 Classpath(在 /bin/setenv.bat 添加 set classpath=yourClassPath),ProcessBuilder 才能执行 Java。
分支2(Tomcat Policy + URLClassLoader)
Tomcat Policy 就是 Java Policy,实现起来完全一样。
在做,能实现,有安全性保证。
第二版:
由于时间仓促,暂时粗略的做了第一版。第二版中想用 Docker 替代相关安全机制,Docker 更加安全。此外还计划用 Hibernate 构建用户数据库。当然,登陆系统也是必要的。
Online Judge(OJ)搭建(第一版)的更多相关文章
- CodeSnippet.info 开源说明 和 环境搭建 (第一版)
Github开源声明 本网站的代码开源,开源的目的如下 技术分享 希望业内同行贡献代码 希望能够让网站更加安全 开源地址: CodeSnippet开源地址 关于代码贡献 任何人都可以贡献代码,一般在 ...
- (二)OJ的主要文件
OJ搭建好了后,我们要熟悉一下OJ项目下的文件及文件夹. 首先,安装好的OJ是在目录var/www/html下. html下的php文件 这些php文件都是些主要跳转页面. admin文件夹 登录管理 ...
- virtual judge 本地部署方案
这是一种将自己的电脑当作服务器来部署一个vj的方法,我也是参考前辈们的做法稍作了改动,如果在服务器上部署的话需要在细节上稍作改动: 一.什么是Virtual Judge? vj的工作原理什么? vj ...
- 利用新浪云平台(SAE) 搭建 HUSTOJ 简易教程
前言: OnlineJudge(OJ)是一种代码在线判定平台,这里有许多的编程题目供你选择,你可以选择题目提交代码,OJ会自动返回你的代码的判定结果.是一种很方便的编程.算法练习平台.详情可见:百度百 ...
- 在线判题系统hustoj的搭建
摘要:ACM/ICPC程序设计竞赛,越来越受到各个高校的重视,是程序设计竞赛中的奥林匹克.Hustoj是搭建在linux系统上的判题系统.能够判断代码的正确性.会及时返回通过或者不通过,如果不通过会返 ...
- (一)在linux上ubuntu搭建hustOJ系统
同实验室有人在用java写签到系统,正好我在学习PHP,我就在想能不能在以前学长留下来一直没用OJ上添加一个签到功能. 于是说干就干,就找了许多关于hustoj的文章参考. 首先要说的是安装husto ...
- Online Judge(OJ)搭建——1、项目介绍
项目名 Piers 在线评测 项目需求 用户: 获取题库.题目的相关信息. 在线对代码进行编译.执行.保存.返回运行(编译)结果. 总体题目评测成绩查询. 用户信息服务,包括注册.登录.忘记密码.邮箱 ...
- Online Judge(OJ)搭建——5、配置
Spring 配置一些本地类,还有 HTML form 提交文件的解析器. package per.piers.onlineJudge.config; import org.springframewo ...
- Online Judge(OJ)搭建——2、数据库,SQL语句
数据库EER图 数据库表.字段.约束解释 users 用户: id 标识符,email 邮箱,password 密码,name 姓名,sex 性别,enabled 启用 ,role 角色 id pri ...
随机推荐
- ExtJS 4.2 评分组件
上一文章是扩展ExtJS自带的Date组件.在这里将创建一个评分组件. 目录 1. 介绍 2. 示例 3. 资源下载 1. 介绍 代码参考的是 Sencha Touch 2上的一个RatingStar ...
- 首个threejs项目-前端填坑指南
第一次使用threejs到实际项目中,开始的时候心情有点小激动,毕竟是第一次嘛,然而做着做着就感受到这玩意水好深,满满的都是坑,填都填不过来.经过老板20天惨无人道的摧残,终于小有成就. 因为第一次搞 ...
- Node.js:进程、子进程与cluster多核处理模块
1.process对象 process对象就是处理与进程相关信息的全局对象,不需要require引用,且是EventEmitter的实例. 获取进程信息 process对象提供了很多的API来获取当前 ...
- C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)
#include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...
- SOLID 设计原则
SOLID 原则基本概念: 程序设计领域, SOLID (单一功能.开闭原则.里氏替换.接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期 引入的记忆术首字母缩略字,指代了面向对象编程和面向对象 ...
- BPM配置故事之案例14-数据字典与数据联动
小明遇到了点麻烦,他昨天又收到了行政主管发来的邮件,要求把出差申请单改由H3 BPM进行,表单如下 行政主管的出差申请表 小明对表单进行了调整,设计出了一份适合在系统中使用的表单,但在"出差 ...
- SuperMap-iServer-单点登录功能验证(CAS)
SuperMap-iServer-单点登录功能验证(CAS) 1.测试目的: 验证SuperMap-iServer使用CAS单点登录的功能是否正常. 2.测试环境: SuperMap-iServer8 ...
- git命令行操作
从本地上传代码到仓库(假设已经建好仓库): 1.初始化: git init 2.将所有文件加入缓存区: git add * 3.提交当前工作空间的修改内容: git commit -m 'commit ...
- gulp 自动添加版本号
本文介绍利用 gulp-rev 和 gulp-rev-collector 进行版本管理 npm官网介绍使用后的效果如下: "/css/style.css" => " ...
- 解决开启服务器防火墙导致ftp不能连接的问题
在防火墙设置的"高级"选项卡中的"网络连接设置"--"本地连接"--"设置"中添加了"FTP服务器" ...