diff --git a/pom.xml b/pom.xml index 471daa5..c782f94 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ WechatTicketSystem love.sola.netsupport WechatTicketSystem - 1.1-SNAPSHOT + 1.2-SNAPSHOT war diff --git a/src/main/java/love/sola/netsupport/api/admin/CheckSession.java b/src/main/java/love/sola/netsupport/api/admin/CheckSession.java new file mode 100644 index 0000000..20b98fd --- /dev/null +++ b/src/main/java/love/sola/netsupport/api/admin/CheckSession.java @@ -0,0 +1,67 @@ +package love.sola.netsupport.api.admin; + +import com.google.gson.Gson; +import love.sola.netsupport.api.Response; +import love.sola.netsupport.enums.Attribute; +import love.sola.netsupport.sql.SQLCore; +import love.sola.netsupport.util.ParseUtil; +import love.sola.netsupport.wechat.WechatSession; +import me.chanjar.weixin.common.session.WxSession; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; + +/** + * *********************************************** + * Created by Sola on 2015/12/21. + * Don't modify this source without my agreement + * *********************************************** + */ +@WebServlet(name = "CheckSession", urlPatterns = "/api/checksession", loadOnStartup = 43) +public class CheckSession extends HttpServlet { + + private Gson gson = SQLCore.gson; + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + doGet(request, response); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + request.setCharacterEncoding("utf-8"); + response.setCharacterEncoding("utf-8"); + response.addHeader("Content-type", "application/json;charset=utf-8"); + PrintWriter out = response.getWriter(); + String json = gson.toJson(check(request)); + out.println(ParseUtil.parseJsonP(request, json)); + out.close(); + } + + private Response check(HttpServletRequest request) { + String t = request.getParameter("token"); + if (t == null || t.isEmpty()) return new Response(Response.ResponseCode.UNAUTHORIZED); + WxSession s = WechatSession.get(t, false); + if (s == null) return new Response(Response.ResponseCode.UNAUTHORIZED); + String more = request.getParameter("more"); + Map result = new HashMap<>(); + result.put(Attribute.AUTHORIZED, s.getAttribute(Attribute.AUTHORIZED)); + if (more != null){ + switch (more) { + case "1": + result.put(Attribute.USER, s.getAttribute(Attribute.USER)); + result.put(Attribute.OPERATOR, s.getAttribute(Attribute.OPERATOR)); + break; + } + } + return new Response(Response.ResponseCode.OK, result); + } + + + +} diff --git a/src/main/java/love/sola/netsupport/api/admin/TicketLog.java b/src/main/java/love/sola/netsupport/api/admin/TicketLog.java new file mode 100644 index 0000000..01abb2a --- /dev/null +++ b/src/main/java/love/sola/netsupport/api/admin/TicketLog.java @@ -0,0 +1,98 @@ +package love.sola.netsupport.api.admin; + +import com.google.gson.Gson; +import love.sola.netsupport.api.Response; +import love.sola.netsupport.pojo.Ticket; +import love.sola.netsupport.sql.SQLCore; +import love.sola.netsupport.sql.TableTicket; +import love.sola.netsupport.util.Checker; +import love.sola.netsupport.util.ParseUtil; +import love.sola.netsupport.wechat.Command; +import me.chanjar.weixin.common.session.WxSession; +import org.apache.commons.lang3.time.DateUtils; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.envers.AuditReader; +import org.hibernate.envers.query.AuditEntity; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +/** + * *********************************************** + * Created by Sola on 2015/12/18. + * Don't modify this source without my agreement + * *********************************************** + */ +@WebServlet(name = "TicketLog", urlPatterns = "/api/admin/ticketlog", loadOnStartup = 35) +public class TicketLog extends HttpServlet { + + public static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); + private Gson gson = SQLCore.gson; + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + doGet(request, response); + } + + @SuppressWarnings("Duplicates") + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + request.setCharacterEncoding("utf-8"); + response.setCharacterEncoding("utf-8"); + response.addHeader("Content-type", "application/json;charset=utf-8"); + PrintWriter out = response.getWriter(); + String json = gson.toJson(query(request)); + out.println(ParseUtil.parseJsonP(request, json)); + out.close(); + } + + private Response query(HttpServletRequest request) { + WxSession session = Checker.isAuthorized(request, Command.LOGIN); + if (session == null) { + return new Response(Response.ResponseCode.UNAUTHORIZED); + } + int first; + int limit; + Date start; + Date end; + try { + first = request.getParameter("first") == null ? 0 : Integer.parseInt(request.getParameter("first")); + limit = request.getParameter("limit") == null ? 20 : Integer.parseInt(request.getParameter("limit")); + start = request.getParameter("start") == null ? getToday() : dateFormat.parse(request.getParameter("start")); + end = request.getParameter("end") == null ? getToday() : dateFormat.parse(request.getParameter("end")); + end = DateUtils.addDays(end, 1); + } catch (ParseException | NumberFormatException e) { + return new Response(Response.ResponseCode.ILLEGAL_PARAMETER); + } + try (Session s = SQLCore.sf.openSession()) { + AuditReader reader = TableTicket.getAuditReader(s); + Object obj = reader.createQuery() + .forRevisionsOfEntity(Ticket.class, false, true) + .addOrder(AuditEntity.revisionNumber().asc()) + .add(AuditEntity.revisionProperty("timestamp").between(start.getTime(), end.getTime())) + .setFirstResult(first) + .setMaxResults(limit) + .getResultList(); + return new Response(Response.ResponseCode.OK, obj); + } catch (HibernateException e) { + e.printStackTrace(); + return new Response(Response.ResponseCode.DATABASE_ERROR, e.getMessage()); + } catch (Exception e) { + e.printStackTrace(); + return new Response(Response.ResponseCode.INTERNAL_ERROR, e.getMessage()); + } + } + + private static Date getToday() { + return DateUtils.truncate(new Date(), Calendar.DAY_OF_MONTH); + } + +} diff --git a/src/main/java/love/sola/netsupport/api/admin/TicketUpdate.java b/src/main/java/love/sola/netsupport/api/admin/TicketUpdate.java index 8bcdee3..c2494f0 100644 --- a/src/main/java/love/sola/netsupport/api/admin/TicketUpdate.java +++ b/src/main/java/love/sola/netsupport/api/admin/TicketUpdate.java @@ -20,6 +20,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; +import java.util.Date; /** * *********************************************** @@ -64,6 +65,7 @@ public class TicketUpdate extends HttpServlet { t.setOperator(op); t.setRemark(remark); t.setStatus(Integer.parseInt(status)); + t.setUpdateTime(new Date()); s.beginTransaction(); s.update(t); s.getTransaction().commit(); diff --git a/src/main/java/love/sola/netsupport/api/admin/root/SetPassword.java b/src/main/java/love/sola/netsupport/api/admin/root/SetPassword.java new file mode 100644 index 0000000..283d5da --- /dev/null +++ b/src/main/java/love/sola/netsupport/api/admin/root/SetPassword.java @@ -0,0 +1,79 @@ +package love.sola.netsupport.api.admin.root; + +import love.sola.netsupport.enums.Access; +import love.sola.netsupport.enums.Attribute; +import love.sola.netsupport.pojo.Operator; +import love.sola.netsupport.sql.SQLCore; +import love.sola.netsupport.util.Checker; +import love.sola.netsupport.util.Crypto; +import love.sola.netsupport.wechat.Command; +import me.chanjar.weixin.common.session.WxSession; +import org.hibernate.Session; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +/** + * *********************************************** + * Created by Sola on 2015/12/20. + * Don't modify this source without my agreement + * *********************************************** + */ +@WebServlet(name = "SetPassword",urlPatterns = "/api/admin/setpass",loadOnStartup = 43) +public class SetPassword extends HttpServlet{ + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + doGet(request, response); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + request.setCharacterEncoding("utf-8"); + response.setCharacterEncoding("utf-8"); + response.addHeader("Content-type", "text/plain;charset=utf-8"); + PrintWriter out = response.getWriter(); + process(request, out); + out.close(); + } + + private void process(HttpServletRequest request, PrintWriter out) { + WxSession session = Checker.isAuthorized(request, Command.LOGIN); + if (session == null) { + out.println("Unauthorized"); + return; + } + + Operator op = (Operator) session.getAttribute(Attribute.OPERATOR); + if (op.getAccess() != Access.ROOT) { + out.println("Unauthorized"); + return; + } + + String id = request.getParameter("id"); + String pass = request.getParameter("pass"); + if (pass == null || pass.length() < 8) { + out.println("Invalid pass"); + return; + } + try (Session s = SQLCore.sf.openSession()) { + s.beginTransaction(); + op = s.get(Operator.class, Integer.parseInt(id)); + if (op == null) { + out.println("Invalid user"); + return; + } + op.setPassword(Crypto.hash(pass)); + s.update(op); + s.getTransaction().commit(); + out.println("Operation success"); + } catch (NumberFormatException e) { + out.println("Invalid id"); + return; + } + } + +} diff --git a/src/main/java/love/sola/netsupport/config/Lang.java b/src/main/java/love/sola/netsupport/config/Lang.java index f947ca0..eeb5721 100644 --- a/src/main/java/love/sola/netsupport/config/Lang.java +++ b/src/main/java/love/sola/netsupport/config/Lang.java @@ -19,8 +19,8 @@ public class Lang { public static Map format_cache = new HashMap<>(32); static { - //noinspection unchecked InputStream in = Lang.class.getClassLoader().getResourceAsStream("lang.yml"); + //noinspection unchecked messages = new Yaml().loadAs(in, Map.class); } diff --git a/src/main/java/love/sola/netsupport/sql/SQLCore.java b/src/main/java/love/sola/netsupport/sql/SQLCore.java index ca16c82..75b2d2c 100644 --- a/src/main/java/love/sola/netsupport/sql/SQLCore.java +++ b/src/main/java/love/sola/netsupport/sql/SQLCore.java @@ -6,10 +6,14 @@ import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import love.sola.netsupport.enums.ISP; +import love.sola.netsupport.wechat.Command; import org.hibernate.Hibernate; +import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.envers.AuditReader; +import org.hibernate.envers.AuditReaderFactory; import org.hibernate.proxy.HibernateProxy; import org.hibernate.service.ServiceRegistry; @@ -56,6 +60,8 @@ public class SQLCore { .registerTypeAdapter(Date.class, (JsonSerializer) (src, typeOfSrc, context) -> new JsonPrimitive(src.getTime())) .registerTypeAdapter(ISP.class, (JsonDeserializer) (json, typeOfT, context) -> ISP.fromId(json.getAsJsonPrimitive().getAsInt())) .registerTypeAdapter(ISP.class, (JsonSerializer) (src, typeOfSrc, context) -> new JsonPrimitive(src.id)) + .registerTypeAdapter(Command.class, (JsonDeserializer) (json, typeOfT, context) -> Command.fromId(json.getAsJsonPrimitive().getAsInt())) + .registerTypeAdapter(Command.class, (JsonSerializer) (src, typeOfSrc, context) -> new JsonPrimitive(src.id)) .registerTypeAdapterFactory(HibernateProxyTypeAdapter.FACTORY) .create(); public static SessionFactory sf; @@ -76,6 +82,10 @@ public class SQLCore { } } + public static AuditReader getAuditReader(Session session) { + return AuditReaderFactory.get(session); + } + public static class HibernateProxyTypeAdapter extends TypeAdapter { public static final TypeAdapterFactory FACTORY = new TypeAdapterFactory() { diff --git a/src/main/java/love/sola/netsupport/sql/TableTicket.java b/src/main/java/love/sola/netsupport/sql/TableTicket.java index cff8b33..075f24c 100644 --- a/src/main/java/love/sola/netsupport/sql/TableTicket.java +++ b/src/main/java/love/sola/netsupport/sql/TableTicket.java @@ -8,7 +8,6 @@ import org.hibernate.criterion.Order; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.hibernate.envers.AuditReader; -import org.hibernate.envers.AuditReaderFactory; import org.hibernate.envers.query.AuditEntity; import java.util.List; @@ -79,15 +78,11 @@ public class TableTicket extends SQLCore { AuditReader reader = getAuditReader(s); return reader.createQuery() .forRevisionsOfEntity(Ticket.class, false, true) - .addOrder(AuditEntity.revisionNumber().desc()) + .addOrder(AuditEntity.revisionNumber().asc()) .add(AuditEntity.id().eq(tid)) .getResultList() ; } } - protected static AuditReader getAuditReader(Session session) { - return AuditReaderFactory.get(session); - } - } diff --git a/src/main/java/love/sola/netsupport/wechat/Command.java b/src/main/java/love/sola/netsupport/wechat/Command.java index 2953f34..d3ff4a9 100644 --- a/src/main/java/love/sola/netsupport/wechat/Command.java +++ b/src/main/java/love/sola/netsupport/wechat/Command.java @@ -34,13 +34,11 @@ public enum Command { } } - public final String name; public final String regex; public final Class handler; public final int id; Command(int id, Class handler) { - this.name = lang("CMD_" + name()); this.id = id; this.regex = lang("REGEX_" + name()); this.handler = handler; @@ -52,7 +50,7 @@ public enum Command { @Override public String toString() { - return name; + return name(); } } diff --git a/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java b/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java index d1257af..6ae5b31 100644 --- a/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java +++ b/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java @@ -24,7 +24,7 @@ import static love.sola.netsupport.config.Lang.lang; * Don't modify this source without my agreement * *********************************************** */ -@WebServlet(name = "WxMpServlet", urlPatterns = "/wechattest", loadOnStartup = 99) +@WebServlet(name = "WxMpServlet", urlPatterns = "/wechat", loadOnStartup = 99) public class WxMpServlet extends HttpServlet { public static WxMpServlet instance; @@ -45,7 +45,7 @@ public class WxMpServlet extends HttpServlet { config.setAppId(Settings.I.Wechat_AppId); config.setSecret(Settings.I.Wechat_Secret); config.setToken(Settings.I.Wechat_Token); - config.setAesKey(Settings.I.Wechat_Token); + config.setAesKey(Settings.I.Wechat_AesKey); wxMpService = new WxMpServiceImpl(); wxMpService.setWxMpConfigStorage(config); diff --git a/src/main/java/love/sola/netsupport/wechat/handler/ProfileHandler.java b/src/main/java/love/sola/netsupport/wechat/handler/ProfileHandler.java index bc39149..c1b775a 100644 --- a/src/main/java/love/sola/netsupport/wechat/handler/ProfileHandler.java +++ b/src/main/java/love/sola/netsupport/wechat/handler/ProfileHandler.java @@ -12,13 +12,11 @@ import me.chanjar.weixin.mp.api.WxMpMessageHandler; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.bean.WxMpXmlMessage; import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; -import me.chanjar.weixin.mp.bean.WxMpXmlOutNewsMessage; -import me.chanjar.weixin.mp.bean.outxmlbuilder.NewsBuilder; +import me.chanjar.weixin.mp.bean.outxmlbuilder.TextBuilder; import java.util.Map; import static love.sola.netsupport.config.Lang.format; -import static love.sola.netsupport.config.Lang.lang; /** * *********************************************** @@ -36,11 +34,8 @@ public class ProfileHandler implements WxMpMessageHandler { session.setAttribute(Attribute.AUTHORIZED, Command.PROFILE); session.setAttribute(Attribute.WECHAT, wxMessage.getFromUserName()); session.setAttribute(Attribute.USER, u); - NewsBuilder out = WxMpXmlOutMessage.NEWS().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()); - WxMpXmlOutNewsMessage.Item item = new WxMpXmlOutNewsMessage.Item(); - item.setTitle(lang("Modify_Title")); - item.setUrl(format("User_Profile_Link", id, u.getName(), u.getIsp().id, u.getNetAccount(), u.getBlock(), u.getRoom(), u.getPhone())); - out.addArticle(item); + TextBuilder out = WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()); + out.content(format("User_Profile_Link", id, u.getName(), u.getIsp().id, u.getNetAccount(), u.getBlock(), u.getRoom(), u.getPhone())); return out.build(); } diff --git a/src/main/resources/lang.yml b/src/main/resources/lang.yml index cb999d2..4d2578d 100644 --- a/src/main/resources/lang.yml +++ b/src/main/resources/lang.yml @@ -6,20 +6,20 @@ Unknown_Encrypt_Type: 'Unknown encrypt-type.' #Command Regex REGEX_QUERY: '^(?i)(Query)|(查询)|(cx)$' REGEX_REGISTER: '^(?i)(Reg(ister)?)|(注册)|(绑定)|(zc)|(bd)$' -REGEX_SUBMIT: '^(?i)(Submit)|(报修)|(bx)$' +REGEX_SUBMIT: '^(?i)(Submit)|(报修)|(保修)|(bx)$' REGEX_CANCEL: '^(?i)(Cancel)|(取消)|(撤销)|(qx)|(cx)$' REGEX_LOGIN: '^(?i)Authme$' -REGEX_PROFILE: '^(?i)(EditProfile)|(修改资料)|(xgzl)$' +REGEX_PROFILE: '^(?i)(EditProfile)|(修改资料)|(修改信息)|(xgzl)|(xgxx)$' #Event -Event_Subscribe: "欢迎使用电子科技大学中山学院网络维护科微信自助报修平台。\n如您在使用中遇到任何问题,请将投诉或建议邮件至loli@sola.love.\n\n请发送'绑定'进行微信绑定" +Event_Subscribe: "欢迎使用电子科技大学中山学院网络维护科微信自助报修平台。\n\n若您尚未进行过微信绑定,请发送'绑定'(bd)进行微信绑定" Invalid_Operation: 'Whoops,报修姬找不到你想要的东西啦 (╯‵□′)╯︵┻━┻。' Message_Spam: '你的打字速度太快了,喝一杯82年的Java压压惊吧。' #Register -Already_Registered: "您已进行过微信绑定。如果需要更改个人信息,请发送 '修改资料' 。" +Already_Registered: "您已进行过微信绑定。如果需要更改个人信息,请发送 '修改资料'(xgzl) 。" #Query Query_Title: '最近一次报修记录:' -More_Details: '查询更早的报修信息,请点击 >' +More_Details: '>>> 查询更早的报修信息,请点击 <<<' No_Ticket_Available: '您尚未提交过任何报修。' #Submit Already_Opening_Ticket: "您上次提交的报修单仍在处理中. 若需要查询报修单状态,请发送 '查询' 。" @@ -37,17 +37,17 @@ Cancel_Title: '报修已取消:' User_Cancel_Remark: '用户手动取消报修。' Cancel_Failed: '取消失败。' #Modify -Modify_Title: '点此修改资料 >' +Modify_Title: '' #Login Not_Operator: '嘟嘟嘟……' No_Login: 'Permission Denied.' Internal_Error: '啊哦,登录失败了哦。' #URL -User_Register_Link: '您尚未进行微信绑定, 请点击这里进行微信绑定操作。' +User_Register_Link: "您尚未进行微信绑定。\n>点击这里进行微信绑定操作<" User_Query_Link: 'http://topaz.sinaapp.com/nm/v1/list.html?token={0}' User_Submit_Link: 'http://topaz.sinaapp.com/nm/v1/rrepair.html?token={0}&name={1}&isp={2}&room={3}&block={4}&phone={5,number,#}' -User_Profile_Link: 'http://topaz.sinaapp.com/nm/v1/modi.html?token={0}&name={1}&isp={2}&account={3}&block={4}&room={5}&phone={6,number,#}' +User_Profile_Link: '> 点此修改资料 <' Result_Page: 'http://topaz.sinaapp.com/nm/v1/result.html' Operator_Home_Page: 'CLICK HERE' Operator_Login_Page: 'http://topaz.sinaapp.com/nm/v1/man/login.html?pkey={0}' @@ -58,7 +58,7 @@ STATUS_UNCHECKED: '待处理' STATUS_SOLVED: '已解决' #Ticket Ticket_Info_Id: '报修单号: ' -Ticket_Info_Desc: '报修描述: ' +Ticket_Info_Desc: '' Ticket_Info_Submit_Time: '提交时间: ' Ticket_Info_Operator: '操作员: ' Ticket_Info_Remark: '维修描述: ' diff --git a/src/test/java/love/sola/netsupport/wechat/TestEncrypt.java b/src/test/java/love/sola/netsupport/wechat/TestEncrypt.java index 5350044..3b7f04e 100644 --- a/src/test/java/love/sola/netsupport/wechat/TestEncrypt.java +++ b/src/test/java/love/sola/netsupport/wechat/TestEncrypt.java @@ -1,9 +1,15 @@ package love.sola.netsupport.wechat; import love.sola.netsupport.util.RSAUtil; +import org.apache.commons.codec.binary.Base64; import org.junit.Test; import org.mindrot.jbcrypt.BCrypt; +import java.security.KeyFactory; +import java.security.NoSuchAlgorithmException; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.X509EncodedKeySpec; + /** * *********************************************** * Created by Sola on 2015/12/6. @@ -24,4 +30,16 @@ public class TestEncrypt { assert "Encrypt".equals(RSAUtil.decrypt(RSAUtil.encrypt("Encrypt"))); } +// @Test + public void testRSASpecKey() throws NoSuchAlgorithmException, InvalidKeySpecException { + System.out.println("RSAUtil.privateKey_s = " + RSAUtil.privateKey_s); + System.out.println("RSAUtil.publicKey_s = " + RSAUtil.publicKey_s); +// String pkey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCA0qyARvHSCIUQ6YM6K+e/QgiZ+dc/MpVz5DIFwQab5iiifruQiaoA74ilHOOiq5i0ToR1VxNhCUZcAy2saHNifoYKTauMOUSV6IoP4X5jp691PlI9yxNx328mSlPNM9+7BgOzrUP1pR71d+T4LDn0o4J6Ad82vVIe7yWszzF4qQIDAQAB"; + String pkey = RSAUtil.publicKey_s; + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.decodeBase64(pkey)); + RSAUtil.publicKey = keyFactory.generatePublic(keySpec); + System.out.println("RSAUtil.encrypt(\"233\") = " + RSAUtil.encrypt("233")); + } + }