搭建 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)搭建(第一版)的更多相关文章

  1. CodeSnippet.info 开源说明 和 环境搭建 (第一版)

    Github开源声明 本网站的代码开源,开源的目的如下 技术分享 希望业内同行贡献代码 希望能够让网站更加安全 开源地址: CodeSnippet开源地址 关于代码贡献 任何人都可以贡献代码,一般在 ...

  2. (二)OJ的主要文件

    OJ搭建好了后,我们要熟悉一下OJ项目下的文件及文件夹. 首先,安装好的OJ是在目录var/www/html下. html下的php文件 这些php文件都是些主要跳转页面. admin文件夹 登录管理 ...

  3. virtual judge 本地部署方案

    这是一种将自己的电脑当作服务器来部署一个vj的方法,我也是参考前辈们的做法稍作了改动,如果在服务器上部署的话需要在细节上稍作改动: 一.什么是Virtual Judge? vj的工作原理什么?  vj ...

  4. 利用新浪云平台(SAE) 搭建 HUSTOJ 简易教程

    前言: OnlineJudge(OJ)是一种代码在线判定平台,这里有许多的编程题目供你选择,你可以选择题目提交代码,OJ会自动返回你的代码的判定结果.是一种很方便的编程.算法练习平台.详情可见:百度百 ...

  5. 在线判题系统hustoj的搭建

    摘要:ACM/ICPC程序设计竞赛,越来越受到各个高校的重视,是程序设计竞赛中的奥林匹克.Hustoj是搭建在linux系统上的判题系统.能够判断代码的正确性.会及时返回通过或者不通过,如果不通过会返 ...

  6. (一)在linux上ubuntu搭建hustOJ系统

    同实验室有人在用java写签到系统,正好我在学习PHP,我就在想能不能在以前学长留下来一直没用OJ上添加一个签到功能. 于是说干就干,就找了许多关于hustoj的文章参考. 首先要说的是安装husto ...

  7. Online Judge(OJ)搭建——1、项目介绍

    项目名 Piers 在线评测 项目需求 用户: 获取题库.题目的相关信息. 在线对代码进行编译.执行.保存.返回运行(编译)结果. 总体题目评测成绩查询. 用户信息服务,包括注册.登录.忘记密码.邮箱 ...

  8. Online Judge(OJ)搭建——5、配置

    Spring 配置一些本地类,还有 HTML form 提交文件的解析器. package per.piers.onlineJudge.config; import org.springframewo ...

  9. Online Judge(OJ)搭建——2、数据库,SQL语句

    数据库EER图 数据库表.字段.约束解释 users 用户: id 标识符,email 邮箱,password 密码,name 姓名,sex 性别,enabled 启用 ,role 角色 id pri ...

随机推荐

  1. Asp.net Core中使用Session

    前言 2017年就这么悄无声息的开始了,2017年对我来说又是特别重要的一年. 元旦放假在家写了个Asp.net Core验证码登录, 做demo的过程中遇到两个小问题,第一是在Asp.net Cor ...

  2. C++ std::set

    std::set template < class T, // set::key_type/value_type class Compare = less<T>, // set::k ...

  3. angular2系列教程(九)Jsonp、URLSearchParams、中断选择数据流

    大家好,今天我们要讲的是http模块的第二部分,主要学习ng2中Jsonp.URLSearchParams.observable中断选择数据流的用法. 例子

  4. UWP开发之Mvvmlight实践八:为什么事件注销处理要写在OnNavigatingFrom中

    前一段开发UWP应用的时候因为系统返回按钮事件(SystemNavigationManager.GetForCurrentView().BackRequested)浪费了不少时间.现象就是在手机版的详 ...

  5. 9、委托、事件、Lambda

    开始 关于委托,肯定是要有问题的. 第一个问题,委托用来干什么? 看.net中的表述:在.net平台下,委托类型用来定义和相应应用程序中的回调.(回调?处理内存中两个实体双向通信的一种技术.)   第 ...

  6. 验证管理员权限(C#)

    参考页面: http://www.yuanjiaocheng.net/webapi/test-webapi.html http://www.yuanjiaocheng.net/webapi/web-a ...

  7. css知多少之绝对定位小记

    一.position定位常见属性 对于属性position来说,属性值有static/relative/absolute/fixed/inherit以下只对绝对定位position:absolute详 ...

  8. (转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)

    原文链接: http://www.cnblogs.com/ants/p/5732337.html 阅读目录 环境说明 准备你的ASP.NET Core应用程序 安装CentOS7 安装.NET Cor ...

  9. Win10连接远程桌面时提示“您的凭据不工作”

    我遇到这个问题的时候查找网上都给出一堆高大上的解决办法, 然而我的错误实际上是用户名的问题, 很多人以为远程用户名就一定是锁屏状态下的登录名, 其实不是,跟自己设置有关,所以首先应该检查远程用户名是否 ...

  10. mysql源码包手动安装、配置以及测试(亲测可行)

    笔记编者:小波/qq463431476博客首页:http://www.cnblogs.com/xiaobo-Linux/ 记下这篇mysql笔记,望日后有用! redhat6采用centos yum源 ...