Java REST使用servlet
我需要将gwt方法转换为REST 我有一个类正在使用一个包含servelet方法的gwt项目,现在我被指派将该项目转换为rest 我在gwt项目中有一个类,其中包含Java REST使用servlet,java,rest,servlets,gwt,Java,Rest,Servlets,Gwt,我需要将gwt方法转换为REST 我有一个类正在使用一个包含servelet方法的gwt项目,现在我被指派将该项目转换为rest 我在gwt项目中有一个类,其中包含 public class TOTPService extends HttpServlet { private static final long serialVersionUID = 1L; private Map<String, TOTPUser> totpUsersMap = new Concurr
public class TOTPService extends HttpServlet {
private static final long serialVersionUID = 1L;
private Map<String, TOTPUser> totpUsersMap = new ConcurrentHashMap<String, TOTPUser>();
private String TOTP_DB_PATH = "otpdb/TOTP.dat";
private File TOTP_DB_FILE = null;
private Gson gson = new Gson();
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
@Override
public void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
if(totpUsersMap.size() < 1){
restoreHOTPData();
}
String method = request.getParameter("method");
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods",
"GET, PUT, POST, OPTIONS");
response.addHeader("Access-Control-Allow-Headers", "Content-Type");
response.addHeader("Access-Control-Max-Age", "86400");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
df.setTimeZone(TimeZone.getTimeZone("UTC"));
//df.gett
String utcTime = df.format(new Date());
System.out.println("--------------------------------");
System.out.println("Request Received @ " + utcTime);
if (method != null) {
if (method.equals("REGISTER")) {
String username = request.getParameter("username");
Base32 base32 = new Base32();
String secretKey = "";
if(!totpUsersMap.containsKey(username)){
secretKey = GoogleAuthenticator.generateSecretKey();
System.out.println("\tNew User : [" + secretKey+ "]");
byte[] sharedSecret = base32.decode(secretKey);
TOTPUser totpUser = new TOTPUser();
totpUser.setUsername(username);
totpUser.setSecret(sharedSecret);
totpUsersMap.put(username, totpUser);
backupTOTPUser();
}else{
if(!totpUsersMap.get(username).isSetup()){
secretKey = GoogleAuthenticator.generateSecretKey();
System.out.println("\tExisting User not finish in setup : [" + secretKey+ "]");
//e2 ung paglalagay ng user at pass
TOTPUser totpUser = totpUsersMap.get(username);
totpUser.setSecret(base32.decode(secretKey));
backupTOTPUser();
}else{
secretKey = base32.encodeAsString(totpUsersMap.get(username).getSecret());
System.out.println("\tExisting User finished setup : [" + secretKey+ "]");
}
}
String s = "otpauth://totp/" + username + "?secret="
+ secretKey;
ByteArrayOutputStream outs = QRCode.from(s).to(ImageType.PNG).stream();
response.setContentType("image/png");
response.setContentLength(outs.size());
//e2 ung nag ooutput sa ram
OutputStream outStream = response.getOutputStream();
outStream.write(outs.toByteArray());
outStream.flush();
outStream.close();
}
}
NOW i am confused on how to convert this to REST
I create a class inside a rest project
that contains this
@Path("/OTPService")
public class OTPService {
TOTPService totpService = new TOTPService();
@GET
@Path("/getOtp")
public void getOtp() {
// I dont know how will i call doGet and doPost from previous class
}
}
public类TOTPService扩展了HttpServlet{
私有静态最终长serialVersionUID=1L;
私有映射totpUsersMap=新的ConcurrentHashMap();
私有字符串TOTP_DB_PATH=“otpdb/TOTP.dat”;
私有文件TOTP_DB_File=null;
private Gson Gson=new Gson();
@凌驾
公共无效数据集(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
doPost(请求、响应);
}
@凌驾
public void doPost(HttpServletRequest请求,
HttpServletResponse响应)引发ServletException,IOException{
if(totpUsersMap.size()<1){
恢复hotpdata();
}
String方法=request.getParameter(“方法”);
addHeader(“访问控制允许来源”,“*”);
addHeader(“访问控制允许方法”,
“获取、出售、过账、期权”);
addHeader(“访问控制允许头”,“内容类型”);
addHeader(“访问控制最大年龄”,“86400”);
DateFormat df=新的简化格式(“yyyy-MM-dd HH:MM:ss”);
df.setTimeZone(TimeZone.getTimeZone(“UTC”));
//德夫盖特
字符串utcTime=df.format(newdate());
System.out.println(“-------------------------------------”);
System.out.println(“收到请求@”+utcTime);
if(方法!=null){
if(方法等于(“寄存器”)){
字符串username=request.getParameter(“用户名”);
Base32 Base32=新的Base32();
字符串secretKey=“”;
如果(!totpUsersMap.containsKey(用户名)){
secretKey=GoogleAuthenticator.generateSecretKey();
System.out.println(“\t新用户:[”+secretKey+“]”);
字节[]sharedSecret=base32.解码(secretKey);
TOTPUser TOTPUser=新TOTPUser();
totpUser.setUsername(用户名);
totpUser.setSecret(共享secret);
totpUsersMap.put(用户名,totpUser);
backuptpuser();
}否则{
如果(!totpUsersMap.get(username.isSetup()){
secretKey=GoogleAuthenticator.generateSecretKey();
System.out.println(“\t当前用户未在设置中完成:[“+secretKey+”]”);
//e2 ung paglalagay ng用户通行证
TOTPUser TOTPUser=totpUsersMap.get(用户名);
totpUser.setSecret(base32.decode(secretKey));
backuptpuser();
}否则{
secretKey=base32.encodeAsString(totpUsersMap.get(username.getSecret());
System.out.println(“\t当前用户已完成设置:[”+secretKey+“]”);
}
}
字符串s=”otpauth://totp/“+用户名+”?机密=”
+秘钥;
ByteArrayOutputStream outs=QRCode.from(s).to(ImageType.PNG).stream();
response.setContentType(“image/png”);
response.setContentLength(outs.size());
//e2 ung nag ooutput sa ram
OutputStream outStream=response.getOutputStream();
outStream.write(outs.toByteArray());
冲水;
exptream.close();
}
}
现在我对如何将其转换为REST感到困惑
我在rest项目中创建了一个类
包含这个
@路径(“/OTPService”)
公共类OTP服务{
TOTPService TOTPService=新TOTPService();
@得到
@路径(“/getOtp”)
公共无效getOtp(){
//我不知道如何称呼上节课的doGet和doPost
}
}
我在休息方面是新手,我不知道我做得对不对
有没有一种方法可以在我的REST项目中使用这个servlet?或者我需要更改不使用servlet的doGet或doPost方法吗?来调用一个servlet到REST中 1) 您需要在xml上设置servlet配置,请参阅示例 tput:选择所有树视图原始视图
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>
SSOOTPServiceREST
</display-name>
<servlet>
<!-- Default servlet container config -->
<servlet-name>
SSOOTPServiceREST
</servlet-name>
<servlet-class>
org.glassfish.jersey.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>
jersey.config.server.provider.packages
</param-name>
<param-value>
com.svi.sso.otpsvc.rest
</param-value>
<!-- Package where methods to be called by REST -->
</init-param>
</servlet>
<!-- servlets inside rest -->
<servlet-mapping>
<servlet-name>
SSOOTPServiceREST
</servlet-name>
<url-pattern>
/otprest/*
</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>
GetOtp
</servlet-name>
<servlet-class>
com.svi.sso.otpsvc.rest.OTPService
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
GetOtp
</servlet-name>
<url-pattern>
/otpservice
</url-pattern>
</servlet-mapping>
<!-- Default page to serve -->
<welcome-file-list>
<welcome-file>
SSOOTPService.html
</welcome-file>
</welcome-file-list>
</web-app>
此api将由另一个使用servlet的项目调用。根据给定的url,响应可能是图像或字符串…当前此api位于gwt项目中。您可以参考服务器端的restyGWT:和jersey:查看。另外,David Chandler提供了一个很好的示例:
@Context
private ServletContext servletContext;
@Context
private HttpServletRequest request;
@Context
private HttpServletResponse response;
@GET
@Path("/getotp")
public void getOtp(request,response) throws ServletException, IOException {
doGet(request, response);//servelet to be called
}