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 ...
随机推荐
- SQLSERVER将一个文件组的数据移动到另一个文件组
SQLSERVER将一个文件组的数据移动到另一个文件组 有经验的大侠可以直接忽视这篇文章~ 这个问题有经验的人都知道怎麽做,因为我们公司的数据量不大没有这个需求,也不知道怎麽做实验 今天求助了QQ群里 ...
- CSS3 border-radius边框圆角
在CSS3中提供了对边框进行圆角设定的支持,可对边框1~4个角进行圆角样式设置. 目录 1. 介绍 2. value值的格式和类型 3. border-radius 1~4个参数说明 4. 在线示例 ...
- npm 私有模块的管理使用
你可以使用 NPM 命令行工具来管理你在 NPM 仓库的私有模块代码,这使得在项目中使用公共模块变的更加方便. 开始前的工作 你需要一个 2.7.0 以上版本的 npm ,并且需要有一个可以登陆 np ...
- 百度MIP页规范详解 —— canonical标签
百度MIP的规范要求必须添加强制性标签canonical,不然MIP校验工具会报错: 强制性标签<link rel="/^(canonical)$/"> 缺失或错误 这 ...
- DBImport V3.7版本发布及软件稳定性(自动退出问题)解决过程分享
DBImport V3.7介绍: 1:先上图,再介绍亮点功能: 主要的升级功能为: 1:增加(Truncate Table)清表再插入功能: 清掉再插,可以保证两个库的数据一致,自己很喜欢这个功能. ...
- 【Win 10 应用开发】在App所在的进程中执行后台任务
在以往版本中,后台任务都是以独立的专用进程来运行,因此,定义后台任务代码的类型都要位于 Windows 运行时组件项目中. 不过,在14393中,SDK 作了相应的扩展,不仅支持以前的独立进程中运行后 ...
- 在Sublime Text 3上安装代码格式化插件CodeFormatter
1.了解CodeFormatter插件 在Sublime Text 3中编写代码,为了能让我们的代码格式变得漂亮整洁,需要一个能自动格式代码的插件.这里发现CodeFormatter插件不错,它能支持 ...
- Javascript中的valueOf与toString
基本上,javascript中所有数据类型都拥有valueOf和toString这两个方法,null除外.它们俩解决javascript值运算与显示的问题,本文将详细介绍,有需要的朋友可以参考下. t ...
- JS案例之2——cycle元素轮播
元素轮播效果是页面中经常会使用的一种效果.这个例子实现了通过元素的隐藏和显示来表现轮播效果.效果比较简单. 效果图如下: 源代码如下: <!DOCTYPE html> <html&g ...
- Linux.NET学习手记(6)
各位读者大家好,好长一段时间没有更新文章了,自从参加工作之后,每天等待去做的工作没完没了,个人的时间也变得奢侈起来,今后要尽量从中脱身,抽更多的时间来完成自己想做的事情(希望如此). 言归正传,上一回 ...